2009-07-09 7 views
4

私はデータベースを設計しており、1対多の関係の必要性を考えていました。伝統的に私は通常のPK(GUIDとして)を行い、関係を設定していましたが、そうした場合、PKとしてビットワイズフラグを使用しないのはなぜでしょうか。プライマリキーにビット単位のフラグを使用していますか?

関係は失われますが、データ自体が関係を記述します。

例 - 私はグループのテーブルとユーザーのテーブルを持っています。ユーザーは1つ以上のグループを持つことができます。

+------------------------+ 
| Groups     | 
+------------------------+ 
| PK  | Display Name | 
+---------+--------------+ 
| 1  | Group A  | 
| 2  | Group B  | 
| 4  | Group C  | 
+---------+--------------+ 

+------------------------+ 
| Users     | 
+------------------------+ 
| Name | Groups  | 
+---------+--------------+ 
| Fred | 1   | // Fred is only in Group A 
| Jim  | 3   | // Jim is in Groups A & B 
| Sam  | 7   | // Sam is in all Groups 
+---------+--------------+ 

このデザインの考え、ご意見、ご提案はどうぞ。

答えて

2

悪い考え...インデックスはどのように機能しますか?すべての値をスキャンして計算する必要があります...

グループXのすべてのユーザーを知りたいとします... 1行ごとに関数を実行してあなたの答えを見つけようとする非常に速い指標を出すのではなく、そのグループに入っていました。

編集:単純に...テーブルのインデックスを使用してグループBのすべてのユーザーを検索するクエリを書いてください...何があっても計算を実行すると遅くなるフィルタされたスキャン

2

いい考えですが、リレーショナルデータベースではどのように役立つのか分かりません。私はあなたがSQLであれば、あなたはかなり標準的なキーを使用しなければならないと思います、そうでなければ高価なストレージのポイントは何ですか?

おそらく、各テーブルが別のファイルにあるファイルベースの記憶域に適しています。または、それを追加の列として持ちますが、主キーは入れません。

P.S. 2人のユーザーが同じグループに所属していると、

Ryan

+0

グループメンバシップはPKではないため、同じグループに属していればOKです。 – GalacticCowboy

5

このようなビットフラグを使用することをお勧めします。 1つは、簡単にこれらのテーブルに参加する能力を壊してしまったため、グループメンバーシップの決定にa)時間がかかる、b)難しくなる、c)おそらくフルテーブルスキャンまたは少なくともインデックススキャンが必要になる。

4

あなたは非常に速く番号を使い果たします。あなたが64グループを持っているなら、すでに64ビットを使っています。あなたが百万人のグループを持っているとどうなるか考えて震えます。

この問題のもう1つの問題は、グループを削除すると少し失われてしまっていることです。あなたはそのビットを後で再利用することができますが、それはあなたが行きたい方法ではないかもしれません。

2

悪いIMO。これは典型的な多対多の関係です。 PKが32ビットの場合、最大32個のグループに1人のユーザーを含めることができます。なぜデザインを制限するのですか?

// Samはすべてのグループに属しています。

デザインを修正し、PK 4ビットを3のinstedにするといいでしょう。 Samは "すべてのグループ"またはグループ0-7のサムになりましたか?

ゲインとは何ですか?

どのようにクエリ(結合)を記述しますか?私はあなたがこのデザインに問題があると思います。

0

私はGUIDが主キーとして最近使用されるのを見てきましたが、これは恐ろしい考えです。 GUIDは "Globally Unique ID"の略であり、複製される可能性のある識別子で、BrockmeyerがOLEブックで誤って引用しているとすると、空の空間で一緒に急いで小さなクルミを形成する"

グローバルに一意のものが実際に必要な場合は、GUIDを使用する理由がありますが、ほとんどのデータベースキーは問題のデータベースに対して一意である必要があります。この場合、逐次生成される整数キーで十分であることが多く、リソースの消費量が大幅に少なくなります。実際には、シーケンスIDやGUIDには固有の意味がありません。したがって、問題のオブジェクトをプライマリキーとして実際に識別する項目を使用することができれば、本当に良いことです。可能であれば(ただし、すべての項目シーケンスやGUIDなどのコンテンツに依存しないキーを持つ必要があります)。

ビットフィールドには、主キーとしていくつかの義務があります。言及したように、あなたは追加のビットが必要と判断するかもしれません。あなたは衝突で終わるかもしれません。データベースは、ビット単位の機能が不十分であり、それでもポータブルではない傾向があります。最後に、選択したデータベースの索引付けアルゴリズムは、ビットセット・キーを最適化できない可能性があります。

+0

GUIDがPKであることの利点の1つは、クライアントコードが、キーとなるものを見つけるためにデータベースに戻る代わりに、キーを(唯一の妥当性を期待して)生成できることです。切断された編集を行っている場合、これは特に有利です。一方、間違いなく注意して治療したいと思っています。たとえば、データの順序が本質的にランダムで、ほとんどの挿入がテーブルの途中にあり、データを移動する必要があるため、GUIDをテーブルのクラスタ化インデックス/キーにしないでください。 – GalacticCowboy

関連する問題