2010-12-07 5 views
0

私はデータベースを持っています。ある表では、各行にその行に関連付けられたユーザーのリストが含まれている必要があります。そうする最善の方法は何ですか?私が持っているオプションは次のとおりです。SQL - 行と物のリストを関連付けるためのデザイン

1) "users"テーブルへのインデックスで、idごとに複数のエントリがあり、各ユーザーごとに1つのカラムがあります。欠点は余分な参加が必要なことです。ユーザーは少なくなりますが、多くの行があります。余分な参加が本当に価値がありますか?

2)すべてのユーザーIDが2の累乗になるようにしてください。 「ユーザー」フィールドは、これらのビット単位のORです。私は32人以上のユーザーを必要としませんが、ビット単位でANDを高速かつ有効に結合できますか?

3)ユーザーの任意の組み合わせに対して個別のユーザーを作成します。 2)のようなものは少ないが知的ではない。

答えて

4

正しい方法を実行します。ビット単位のフィールドは、その列の有用な索引付けを防止します。

アソシエーションテーブルが必要です。アソシエーションテーブルには、それぞれの組み合わせの行が含まれている必要があります。優れたクエリパフォーマンスを提供するのはデータベースの仕事です。うまく構造化されたテーブルを使って実行します。余分な結合をここやそこで汗ばませてはいけませんが、データを正確かつ離散的に正規化してください。

+0

新しい行を追加するとき、既存のすべての組み合わせをチェックして、それが既に存在するかどうかを確認するのはどうですか?または、別々のIDと重複した組み合わせがありますか? – Claudiu

+1

組み合わせはありません。ジョインテーブルには、RowID、UserIDの2つのフィールドがあります。特定の各行に関連付けられている特定のユーザーをそれぞれ挿入します。一般に、単一のフィールドに値のリストを格納する(または格納することを考えている)場合は、間違っています。 – Joe

+0

ええ、それは私が結合テーブルが、私が理解していることを確認するようなものだと思ったものです。 – Claudiu

2

alt text

+0

このE-Rダイアグラムを生成するためにどのモデリングツールを使用しましたか? –

+0

@Rajesh CA Erwin –

+0

ちょっとした提案がありますが、業界標準の図表表記法の1つを、そのような迷惑なアイコンなしで使用することをお勧めします。 – sqlvogel

1

あなたはデータの目的について多くの情報を提供していませんでした。

Table:  User_RowEntry_Assignment 
UserId:  int 
RowEntryId: uniqueidentifier 

それはユーザーの割り当てが無関係であることをユーザの割り当てを、照会せずにデータを照会することが可能となるので、これは良いパターンです:私は通常、このような何かを行います。たとえば、一連の仕様を持つRowEntryアイテムをすべて検索し、関連するユーザーが重要でない場合は、ユーザー情報を取得する必要はありません。また、複雑な操作を必要とせずに複数のユーザー行の割り当てを行うことができます。

+0

これがどのように見えるかを見るためにDamirの答えを見てください。 – smartcaveman

関連する問題