あなたが尋ねているので、それは良い習慣ですが、いくつかの例では(データへの結合は必要ありません)、絶対に必要ではないかもしれません. ただし、最大の問題は、要件が変更されるかどうかを実際に知ることはできないため、今本当に必要なため、事後に10mレコードテーブルに追加しないことです.....
主キー(複数の列にまたがることができます)に加えて、単一のフィールドである二次候補キーを用意することをお勧めします。これにより、結合が容易になります。
まずいくつかの理論。y = f(x)
HS またはカレッジ代数の関数の定義は、すべての x に対して y が 1 つだけ存在する場合にのみ、f が関数であるということを覚えているかもしれません。この場合、リレーショナル数学では、y はfunctionally dependent
x 上にあると言えます。
同じことがデータにも当てはまります。小切手番号、当座預金口座番号、および金額を格納しているとします。複数の当座預金口座があり、各当座預金口座に重複する小切手番号が許可されていないと仮定すると、金額は機能的に (account, check_number) に依存します。一般に、同じものに機能的に依存し、推移的な依存関係がないデータを一緒に保存したいと考えています。通常、主キーは、主キーとして指定した機能依存関係になります。これにより、行内の残りのデータが識別されます (その識別子に関連付けられているため)。これをnatural primary key.
可能な場合 (つまり、MySQL を使用しない場合)、主キーが複数の列にまたがっていても、主キーが自然キーであると宣言するのが好きです。複数の交換可能な候補キーがある場合、これは時々複雑になります。たとえば、次のことを考慮してください。
CREATE TABLE country (
id serial not null unique,
name text primary key,
short_name text not null unique
);
このテーブルでは、実際には任意の列を主キーにすることができます。3 つすべてが完全に受け入れ可能な候補キーです。国レコード (232、「米国」、「米国」) があるとします。これらの各フィールドはレコードを一意に識別するため、1 つがわかれば他のフィールドも知ることができます。それぞれを主キーとして定義できます。
また、結合のリンクに使用される単なるマシン識別子である、2 つ目の人工的な候補キーを用意することもお勧めします。上記の例では、country.id がこれを行います。これは、他のレコードを国テーブルにリンクするのに役立ちます。
候補キーを必要とする例外は、重複レコードが実際に発生する可能性がある場合です。たとえば、請求書を追跡しているとします。2 つの項目のそれぞれに 1 つずつ表示されている 2 つの項目に対して、誰かが個別に請求される場合があります。これらは同一である可能性があります。この場合、後でそのレコードに何かを結合できるようにするため、人工的な主キーを追加することをお勧めします。今はそうする必要はないかもしれませんが、将来必要になるかもしれません!