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
+---------+--------------+

このデザインについての考え、コメント、提案をお願いします。

4

6 に答える 6

5

このようなビットフラグの使用はお勧めしません。1つには、これらのテーブルを簡単に結合する機能が壊れているため、グループメンバーシップの決定には、a)時間がかかり、b)困難になり、c)全表スキャンまたは少なくともインデックススキャンが必要になる可能性があります。

于 2009-07-09T12:31:42.587 に答える
4

あなたはすぐに数を使い果たすでしょう。64グループがある場合は、すでに64ビットを使用しています。あなたが百万のグループを持っているとしたらどうなるかを考えると私は震えます。

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

于 2009-07-09T12:31:59.653 に答える
2

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

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

デザインを変更して、PKを3ビットで4ビットにしたとします。Samは「すべてのグループ」に含まれていますか、それともグループ0〜7のみに含まれていますか?

利益は何ですか?

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

于 2009-07-09T12:37:42.853 に答える
2

いいアイデアですが、リレーショナルデータベースで実行することでどのようなメリットが得られるかはわかりません。SQLを使用している場合は、ほとんど標準キーを使用する必要があると思います。そうでない場合、高価なストレージのポイントは何ですか?

おそらく、各テーブルが異なるファイルにあるファイルベースのストレージに適しています。または、追加の列として使用しますが、主キーを配置しないでください。

PS 2人のユーザーが同じグループにいると、転倒しませんか?

ライアン

于 2009-07-09T12:29:59.827 に答える
2

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

グループXのすべてのユーザーを知りたいとしましょう...答えを見つけるために非常に迅速なインデックスシークを行うのではなく、すべての行で関数を実行して、そのグループに含まれているかどうかを判断する必要があります.

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

于 2009-07-09T16:15:58.910 に答える
0

最近、GUIDが主キーとして使用されるのをかなり見ましたが、それは恐ろしい考えだと思います。GUIDは「GloballyUniqueID」の略で、つまり、複製されたビンビンの可能性が、彼のOLE本でブロックマイヤーを誤って引用する識別子です。 "。

グローバルに一意の何かが実際に必要な場合は、GUIDを使用する十分な理由がありますが、ほとんどのデータベースキーは、問題のデータベースに対して一意である必要があるだけです。この場合、順次生成される整数キーで十分なことが多く、リソースの消費が大幅に少なくなります。実際には、シーケンスIDもGUIDも固有の意味を持たないため、可能であれば、問題のオブジェクトを主キーとして実際に実際に識別するアイテムを使用できると非常に優れています(ただし、すべてのアイテムを言う学派があります)シーケンスやGUIDなどのコンテンツに依存しないキーが必要です)。

ビットフィールドには、主キーとしていくつかの責任があります。前述のように、追加のビットが必要になる場合があります。衝突する可能性があります。データベースはビット単位の機能が不十分であり、それでも移植性がない傾向があります。そして最後に、選択したデータベースのインデックス作成アルゴリズムでは、ビットセットキーを適切に最適化できない場合があります。

于 2009-07-09T12:47:04.323 に答える