0

ユーザーがいくつかのプロジェクトを開くことができる C# で .net を使用して webApp を構築しています。すべてのプロジェクトには、マップ上のアイテムの MYSQL のマップとテーブルが含まれています。(全員が同じテーブルを持っています)。2 つのオプションの間で SQL 構造を構築する方法を考えています。1) サイトに登録したすべての人が、自分自身に新しいデータベースを取得します。2) すべてが一意の ID を取得し、テーブル内のすべてのアイテムにこの ID の列が追加され、ID によってこのアイテムのみが選択されます。

何がより効果的になりますか?

4

2 に答える 2

1

他の回答者がすでに述べたように、ユーザーごとにデータベースを作成することは非常にまれです。しかし、すぐにすべての列に user_id を追加するのも得策ではないかもしれません。

理想的には、さまざまなデータ (この場合はユーザー、マップ、アイテム) 間の関係を適切に設計し、適切なインデックス作成/キーを使用して柔軟で効率的なスキーマを作成する必要があります。

設計例は次のとおりです。

CREATE TABLE user (
 int id NOT NULL,
 .... // user data fields will come here...
 PRIMARY KEY(id)
) ENGINE = InnoDB;

CREATE TABLE map (
 int id NOT NULL,
 .... // map data fields will come here...
 PRIMARY KEY(id)
) ENGINE = InnoDB;

CREATE TABLE item (
 int id NOT NULL,
 .... // item data fields will come here...
 PRIMARY KEY(id)
) ENGINE = InnoDB;

CREATE TABLE map_has_item (
  int map_id NOT NULL,
  int item_id NOT NULL,
  PRIMARY KEY (map_id, item_id),
  FOREIGN KEY (map_id) REFERENCES map (id),
  FOREIGN KEY (item_id) REFERENCES item (id)
) ENGINE = InnoDB;

CREATE TABLE user_has_map (
  int user_id NOT NULL,
  int map_id NOT NULL,
  PRIMARY KEY (user_id, map_id),
  FOREIGN KEY (user_id) REFERENCES user (id),
  FOREIGN KEY (map_id) REFERENCES map (id)
) ENGINE = InnoDB;

上記の設計は、アプリケーションに関連する単純なクエリを作成するのに役立ちます。上記のインデックスを使用するすべてのクエリも高速になります。

さらに、潜在的な機能の追加に十分な柔軟性があります。たとえば、他のユーザーが別のユーザーのマップに貢献できるようになった場合、パーミッション/ロール列を user_has_map テーブルに追加し、この列を適切に設定して新しい行を追加できます。

上記で定義した外部キ​​ーを改善して、データの整合性を確保することができます (データベースに意味的に正しいデータを保持します)。ON DELETE および ON UPDATE トリガーを設定して、マップまたはユーザーがデータベースから削除されたときのクリーンアップを簡素化できます。外部キーの詳細については、以下のリンクを参照してください。

http://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html

MySQLの外部キーの基礎?

于 2013-11-03T11:19:07.930 に答える
0

1 つのデータベース。一意の ID。ほぼすべてのストアド プロシージャまたは SQL ステートメントには、"WHERE UniqueID = " が含まれています。

于 2013-11-03T10:18:24.847 に答える