5

質問

データベース ID が「無意味」であることは経験則として適切ですか? 逆に、ID を一目で認識できるように構造化することには、大きな利点がありますか? 長所と短所は何ですか?

バックグラウンド

データベース内の ID の一貫性について同僚と議論しました。コードを変更する必要がほとんどないように、Spring を活用するデータ駆動型アプリケーションがあります。つまり、問題が発生した場合、通常はデータの変更が解決策になります。

私の主張は、ID を一貫して読みやすくすることで、長期的にはかなりの時間と頭痛の種を節約できるというものでした。ID が設定されると、頻繁に変更する必要はありません。適切に設定されていれば、将来の変更は難しくありません。私の同僚の立場は、ID は重要であってはならないというものでした。情報を ID にエンコードすることは、DB の設計ポリシーに違反しており、ID を整理するには、「時間がない」という余分な作業が必要になります。どちらの立場を支持するものもオンラインで見つけることができません。だから私はここ SA のすべての達人に目を向けています!

食料品店の食品を表すデータベース レコードの単純化されたリストを想像してください。最初のセットは ID にエンコードされた意味を持つデータを表し、2 番目のセットは意味を持たないデータを表します。


ID の意味:

Type
1 Fruit
2 Veggie

Product
101 Apple
102 Banana
103 Orange
201 Lettuce
202 Onion
203 Carrot

Location
41 Aisle four top shelf
42 Aisle four bottom shelf
51 Aisle five top shelf
52 Aisle five bottom shelf

ProductLocation
10141 Apple on aisle four top shelf
10241 Banana on aisle four top shelf
//just by reading the ids, it's easy to recongnize that these are both Fruit on Aisle 4

意味のない ID:

Type
1 Fruit
2 Veggie

Product
1 Apple
2 Banana
3 Orange
4 Lettuce
5 Onion
6 Carrot

Location
1 Aisle four top shelf
2 Aisle four bottom shelf
3 Aisle five top shelf
4 Aisle five bottom shelf

ProductLocation
1 Apple on aisle four top shelf
2 Banana on aisle four top shelf
//given the IDs, it's harder to see that these are both fruit on aisle 4

概要

ID の読みやすさと一貫性を維持することの長所と短所は何ですか? あなたは一般的にどちらのアプローチを好みますか、またその理由は何ですか? 業界で認められているベストプラクティスはありますか?

--------編集( 以下のコメントからの役立つ背景情報 ):--------

私たちのテーブルでは、主キーは常に一意の整数を含む ID フィールドです。最初は、その整数は任意でした。時間が経つにつれて、これらの ID の一部は開発者/テスターの間で自然に意味を持つようになりました。最近のリファクタリング中に、一部の開発者は、すべての ID を認識しやすくするために時間をかけました。みんなの仕事が 100 倍簡単になりました。一部の人々 (実際にはデータ/コードを使用していない) は、理論的な理由で激しく反対しました。実際には、これらの反論のどれも当てはまりません。さらに、データを使用するすべての開発者は、データの保守が大幅に容易になったことに同意しています。

私は、データ中心の環境ですぐに認識できる ID を使用することに対する正当な理由を探しています (ただし、見たことはありません)。

4

11 に答える 11

21

短所:「AisleFivetopshelf」を「AisleSixtopshelf」に変更したので、IDを61に変更し、「Grapes onAislefivetopshelf」のProductLocationIDを10461に変更する必要があります。棚の場所ID文字列が私のデータベースのIDに表示されるのはどこですか41のダイダイダイ。

于 2011-02-09T22:29:53.110 に答える
6

データベース ID を使用して行に関する情報をエンコードする場合、いくつかの問題があります。ニンジンの「ID」を 203 にしたい場合は、product_id(たとえば) 列を追加して、代わりにこの情報をそこに配置する必要があります。なんで?

  1. ID をカスタマイズすると、ID を管理するドメイン固有のコードを追加する必要があり、自動インクリメントや UUID などのデータベース機能に頼ることはできません。
  2. 分類を変更する必要がある場合は、テーブルの関係、ブラウザーのブックマーク、検索エンジンの結果などが台無しになります。
  3. これは一般的な方法ではありません。そのため、アプリケーション固有またはドメイン固有のデータを ID フィールドに入力すると、多くの人はこれが無意味な情報であると想定しますが、そうではありません。これが貴重な情報であるという事実に注意するために、データ ディクショナリが必要になります (そして、人々がデータ ディクショナリを読むようにする必要があります)。

ID の唯一の必要な目的は、テーブル内の行を一意に識別することです。ルックアップ性能が良ければおまけですし、コンパクトに収納できればさらにお得です。ただし、そのエンティティの一意の識別子を除いて、それが識別する行にエンティティに関する情報を含めることはできません。

于 2011-02-09T23:24:27.890 に答える
5

さて、あなたの10141「アップルは通路4にある」とすると、製品が棚10の通路にあることになった場合はどうなりますか?それとも、その製品は棚の上の通路にありますか、それとも棚にないので床に座っている通路の製品ですか?1411014110141

このようにデータを混合し始めると、通常、コンポーネントを確実に抽出する機能が失われます。人間が読める形式のキーはすべて素晴らしくてダンディですが、人間の形が基づいている個々のIDを破壊することは決してありません。

于 2011-02-09T22:31:26.750 に答える
4

「読める」とはどういう意味ですか?通常、ID は単なる数字です。また、「一貫性がある」とはどういう意味ですか? 通常、ID は単に増加する数字です。それ以上に一貫性を保つことはできません。情報がすでにデータベースに明示的に存在しているのに、情報を ID にエンコードしようとして時間と労力を無駄にする必要はありません。「整然とした」ID を利用するのは誰ですか?

于 2011-02-09T22:28:29.207 に答える
3

これが代理キーに関する私の見解です。(または、それらを呼び出したい場合はID)

代理キーにはビジネス上の意味はありません。行を一意に識別するために使用されます。しかし、行を識別するだけではありません。彼らは列の「魂」でもあります。変更または取引することはできません。サロゲートが「魂」の原則に従う場合、行を削除すると、新しい行がデッド行の値を取得することはありません。魂は、死んでなくなった後でも、削除された行に属しています。

サロゲートである必要はありませんが、私はサロゲートが「魂」であることを好みます。

サロゲートの利点は、変更する必要がないことです。他の 30 個のテーブルにメイン テーブルへの外部キーがある場合、メイン テーブルの PK が変更されたときに 30 個すべてを更新する必要はありません。変化する可能性のある値に CANDIDATE キーを使用することはできますが、変化する可能性があるため、行の魂ではありません。

多くの場合、代理キーは自動インクリメント整数です。これは、クラスター化されたインデックスに最適です。テーブルの結合は、可能な限り良好になります。新しい値がシーケンシャルになることはめったにないため、自然キーはひどいクラスター化インデックスを作成する傾向があります。整数は小さい固定長のデータ型で、さらに高速に照合できます。

名前が変わっても、あなたはあなたのままです。指紋を焼いてしまっても、あなたはあなたのままです。神は代理キーを使用しているので、データベースで使用しても問題ないと思います。

編集 質問をより注意深く読んだ後、実際には「無意味なキー」を間違った方法で使用していると思います。

リンゴ/場所の関連付けを表す値「10141」があります。これは、2 つのサロゲートを 1 つのフィールドに組み合わせたものです。それらを別々のフィールド「101」と「41」として保持し、それらのフィールドのコンボで PK を作成します。それらを分離しておくと、検索、インデックス、テーブル結合などが簡単になります。

その通りです。マッピング テーブルに別のサロゲートは必要ありません。2 つのサロゲートの組み合わせは、それ自体がサロゲートです (ただし、魂ではありません)。コンボを 1 列に結合するのではなく、2 つの別々の列で表現するだけです。 編集終了

于 2011-02-10T01:05:44.283 に答える
3

キー設計の 3 つの主要な基準は、親しみやすさ、シンプルさ、安定性です。使い慣れたシンプルなキーを使用すると、ユーザーは認識しやすく、覚えやすく、使いやすくなります。キー値を入力して使用するときに間違いを犯す可能性が低くなり、データの品質と使いやすさが向上します。

この質問を解決するには、どのタイプの識別子が使いやすいかをユーザーに尋ねるか、それが非常に重要である場合は別のスキームをテストすることをお勧めします。いずれにせよ、開発者だけがその決定を下すべきではありません。一部の組織には、使用する標準コーディング スキームの定義を担当する部門または個人がいます。

于 2011-02-10T14:44:36.297 に答える
3

意味のある ID は「データベース設計ポリシー」に反しません!

それとは正反対に、実際のリレーショナル データベースは最初からそうでした。データにビジネスの観点から一意の属性の組み合わせが含まれている場合、それを ID にしないと、通常、ボイス-コッドの正規形が崩れます。そして、それに付随する異常をもたらします。

ID にエンコードされた情報が他のフィールドの内容と重複しない限り、そのまま使用してください。冗長な場合は、複数列の主キーを作成します。ORM ではあまり便利ではありませんが、データ駆動型アプリケーションでは便利です。

補遺: (元の質問の編集後)

あなたの場合、データ駆動型アプリケーションの場合、次のようにします。

Type
==========
Fruit
Veggie

Product
==========
Apple    Fruit
Banana   Fruit
Orange   Fruit
Lettuce  Veggie
Onion    Veggie
Carrot   Veggie

Isle
==========
4
5

Shelf
==========
top
bottom

Location
==========
4   top
4   bottom
5   top
5   bottom

ProductLocation
==========
Apple    4  top
Banana   4  top

このような設定では:

  • データは正規化されています
  • ProductLocation テーブルで任意の製品の場所を確認できます。棚も確認できます。
  • サロゲートなし
  • クエリの種類によっては、この構造は実際には他の命題よりも優れたパフォーマンスを発揮します。これは、必要な結合が少ないためです (または、より多くのストレージが必要なため遅くなる可能性があります)。
  • これは、"on replace update" 制約をサポートする RDBMS で最適に機能します。
  • 名前をIDとして扱いたい場合は、おそらく「表示名」のような列を追加する必要があります。これは、人々が物事のIDを変更したいよりも、表示されるものを頻繁に変更したいためです.
于 2011-02-09T22:40:09.437 に答える
2

ID はあなたにとって意味のあるものかもしれませんが、コンピューターにとっては必ずしも意味のあるものではありません。データベース ソフトウェアは、そのようなパターンを検出するのに十分なほどインテリジェントにはなりません (そうするようにプログラムしない限り、明らかに、その価値よりも多くの問題が発生します)。将来、予期していなかった ID との競合が発生した場合に備えてください。

あなたがしようとしている点は理解していますが、優れたデータベース設計には、データベース エンジンが読み書きできるようにできるだけ簡単にすることが含まれます。最適化できる領域を見つけるために、インデックスを設定し、データベースのパフォーマンスを調査することをお勧めします。

于 2011-02-09T22:34:19.673 に答える
1

これをコメントにしようと思ったのですが、あまりにも複雑かもしれません。

一般的に、ID には意味があるべきではないというのがコンセンサスな意見だと思います。おそらく、質問をシナリオの詳細に限定すると、意見が異なるでしょうか?

あなたのコメントに基づいて、スプレッドシートからデータをロードしているように聞こえましたが、異なるデータ間の関係を判断する方法として意味のある ID を使用していると思いますか?

データベースに自動インクリメント ID を処理させず、ユーザー (開発者?) にコードを定義させる理由はありますか? このようにして、外部キーを介して参照整合性を維持し、適切に正規化することもできます。データを簡単に確認する必要がある場合は、何らかの命名規則を使用して計算列を作成できます。それはあなたのニーズにとってさらに意味があるかもしれません?

例えば

Code Description
==== ===========
F    Fruit
V    Veggie

Product Code Product Type Product Description
============ ============ ===================
AP           F            Apple
BA           F            Banana

Location Code Location Description
============= ====================
AFTS          Aisle four top shelf
AFBS          Aisle four bottom shelf


Product Code Location 
============ ========
AP           AFTS 
BA           AFTS

実際には、場所は通路と棚にさらに正規化できますが、アイデアはわかります。

データがデータベースに挿入されると、レコードごとに ID が作成され、コードによって関係を判別でき、外部キーを適切な ID に設定できます。アプリケーションは、コードを知らなくても ID を処理できます。

したがって、製品の場所は次のようになります。

Product ID Location ID
========== ===========
1          1 
2          1

さらに説明的なものが必要な場合は、SQL で結合してコードを取得するか、計算列を作成するか、アプリで ID をキャッシュからコードにマップすることができます。

例えば

Product ID Location ID ProductCode_LocationCode
========== =========== ========================
1          1           AP_AFTS
2          1           BA_AFTS

それは少しパフォーマンスに影響を与えます。私はまだその要点を理解していませんが、おそらくそれはあなたを助けますか?

わかりました、それは長すぎました。:)

于 2011-02-10T01:23:36.940 に答える
1

ズーコの三角形とペットネームの概念は、ここで関連している可能性があります。

于 2011-02-09T22:37:14.840 に答える
0

大差ないと思います。私は機会があれば常に自分の ID を再シードする傾向がありますが、それは私だけです。コードでそれらを参照する場合[たとえば列挙型]、IDに何らかの順序があると便利だと思いますが、それ以外は心配しません。

于 2011-02-09T22:34:43.063 に答える