0

私は次のようなデータベース構造を持っています:

 tbl_products
 -pk id (AutoIncrement)
 -name
 -description

 tbl_tags (1)   OR   tbl_tags (2)
 -pk name            -pk id (AutoIncrement)
                     -name (unique)

 tbl_products_tags
 -fk product_id
 -fk tag_id

私はほとんどの人がデータ構造tbl_tags(2)を選択するのを見てきました。名前は常に一意なので、tbl_tags(1)を選択できるかどうかを尋ねたいので、それをプライマリにします。マイナス面はありますか?

4

2 に答える 2

3

タグ名を一意にする場合、名前を変更する必要がある場合にどうするかを考える必要があります。たとえば、「タグ」を「タグ」に変更したい場合。

これが主キーの場合、制約が有効になるように、「タグ」を参照するすべての子レコードも更新する必要があります。特定の名前を参照する行が多数ある場合、この変更の実行は遅くなる可能性があり、アプリケーションにブロッキング/競合が発生する可能性があります。一方、サロゲート主キーを使用する場合、すべての子行を更新する必要はなく、一意の名前フィールドのみを更新する必要があります。

タグ名を更新しないことが確実な場合は、それを主キーとして使用できます。ただし、要件の変更には注意してください。

通常、自然キーは、外部ソースによって発行および管理されるコード (空港コード、通貨コード、国コードなど) を使用する場合に意味があります。このような場合、自然キーは変更されず、ドメイン内で一意であることが保証されます。

于 2013-01-26T16:01:02.097 に答える
1

私の理解では、オプション 2 と比較した場合、非常に大きなデータセットのコンテキストでは tbl_tags (1) のパフォーマンスがわずかに低下します。小さなデータセットでは、おそらくそれほどではありません。マシンは、文字列よりもはるかに効率的に整数を処理できます。

ただし、全体像としては、最新のプロセッサ速度では、最大のデータセットを除いて、この 2 つの違いは無視できるかもしれません。

もちろん、ここではリレーショナル データベースについて話しています。NoSQL のさまざまなフレーバーは別物です。

また、一貫性の問題もあります。データベース内の他のテーブルはすべて、自動インクリメント整数 ID を使用しているようです (私が想定しているもの)。そのため、tags テーブルでも使用します。

データベースの設計における自動インクリメント整数 PK フィールドと「自然キー」の使用は、長年の議論です。私の理解では、学者は主に「自然キー」の概念を好みますが、実際には、生成された一意のキーの何らかの形式が標準になる傾向があります。

個人的には、エンド ユーザーにとって意味のない生成されたキー、可能な場合は整数を作成することを好みます。何か見落としがない限り、インデックスのパフォーマンスは大幅に向上しています。

于 2013-01-26T15:45:28.627 に答える