すべてのテーブルに主キーが必要ですか?


339

データベーステーブルを作成していますが、論理プライマリキーが割り当てられていません。だから、私は主キーなしでそれを残すことを考えていますが、私はそれについて少し罪悪感を感じています。したほうがいい?

すべてのテーブルに主キーが必要ですか?


5
テーブルについてもう少し詳しく教えてください。答えはおそらく「はい」です。
ライアンベア

7
はい、すべてのテーブルに主キーが必要です。
Syed Tayyab Ali、

回答:


312

短い答え:はい

長い答え:

  • テーブルを何かで結合できるようにする必要があります
  • テーブルをクラスター化する場合は、ある種の主キーが必要です。
  • テーブルのデザインに主キーが必要ない場合は、デザインを考え直してください。おそらく、何かが足りないでしょう。同一の記録を保持するのはなぜですか?

MySQLでは、明示的に指定しなかった場合、InnoDBストレージエンジンは常に主キーを作成するため、アクセスできない追加の列が作成されます。

主キーは複合にすることができることに注意してください。

多対多のリンクテーブルがある場合は、リンクに関係するすべてのフィールドに主キーを作成します。したがって、1つのリンクを説明する2つ以上のレコードがないことを確認します。

論理的な整合性の問題に加えて、ほとんどのRDBMSエンジンは、これらのフィールドを一意のインデックスに含めることでメリットを得ます。

また、主キーには一意のインデックスの作成が含まれるため、それを宣言して、論理的な一貫性とパフォーマンスの両方を実現する必要があります。

一意のデータに一意のインデックスを常に作成する必要がある理由については、私のブログのこの記事を参照してください。

PS主キーを必要としない非常に特殊なケースがいくつかあります。

ほとんどの場合、パフォーマンス上の理由からインデックスを持たないログテーブルが含まれます。


彼らはまだ主キー、複合キーを持っています
kristof 2009年

2
@annakata:複合主キーが必要です
Quassnoi、2009年

1
「そしてPRIMARY KEYにはUNIQUEインデックスの作成が含まれるため」はOracleには当てはまりません。一意でないインデックスを使用して、主キーを強制できます。実際、一意制約とPK制約で非一意索引を使用することが必要になる場合があります。
ステファニーページ

3
「なぜ同一のレコードを保持するのですか?」という修辞的な質問に対するコメントだけです。PKを追加するだけでは、重複がないことは保証されないことに注意してください。多くの場合、PKはユーザーには表示されないため、重要なのは重複したデータを含む可能性のある表示フィールドです。設計によっては、これが望ましい場合とそうでない場合があります。
ロスコ2015年

1
キーは結合可能性とは何の関係もありません。また、クラスタリングの引数は、使用するDBMSに依存し、論理的および物理的な考慮事項が混在しています。
Jon Heggland

35

主キーは常に最善です。このようにして、最初の正規形を満たし、データベースの正規化パスに沿って続行することができます。

他の人が述べたように、主キーを持たない理由はいくつかありますが、主キーがあればほとんどは害されません


5
@PaulSuartデータは常に通常の形式である必要はありません。実際、データが巨大になった場合、通常の形式で保持するべきではありません。そうしないと、データへのアクセスが、テーブル結合などを実行するクエリにとって非常に遅くなります。巨大な。
パチェリエ

13

主キーなしでテーブルを作成したときはいつでも、テーブルは必要ないと考えていたので、戻って1つ追加してしまいました。次に、主キーとして使用する自動生成されたIDフィールドを持つ結合テーブルも作成します。


12
結合テーブルは主キーであり、結合される両方のレコードのPKで構成される複合キーです。例:CREATE TABLE PersonOrder(PersonId int、OrderId int、PRIMARY KEY(PersonId、OrderId))。
キースウィリアムズ、

3
はい。ただし、リンクテーブルに3番目の属性もある場合は、「OrderDate」と言いましょう。それを複合キーにも追加しますか?IMHOいいえ-これはさらに縮小可能であり、主キーが持つべき縮小不可能な文字を提供しないためです。
stevek 2012年

13

いくつかの非常にまれなケース(多対多のリレーションシップテーブル、または大量のデータの一括読み込みに一時的に使用するテーブル)を除いて、私はこう言います。

主キーがない場合、それはテーブルではありません!

マーク


9
厳密に言えば、その文は間違っています。テーブルは、クエリ言語によって作成された「ビューテーブル」にすることができます。RDBMSは、テーブルではなくリレーションで構成されます。その文は、「主キーがない場合、リレーションではない!」と言う必要があります。
stevek 2012年

あるいは、「候補キーがない場合は、リレーショナルテーブルではありません」。しかし、リレーションを表さないテーブルを用意しても問題ない非常にまれなケースを参照してください。
Walter Mitty、2018

多対多のテーブルに主キーがないのはなぜですか?別の主キーを作成してから、外部キーの代理の一意のインデックスを作成できます。すべてのテーブルに主キーがある方がいいと思います。一括読み込みテーブルでも、ETLプロセスで重複するレコードを特定するのに役立つため、インポートされるデータを含まない主キーを個別に特定する必要がある場合があります。少しだけストレージがあっても、すべてのテーブルには主キーが必要です。ビューによって作成されたテーブルは、テーブル自体ではなく、テーブルのサブセットです。
ジョンアーネスト

1
多対多の関係テーブルでは、関係の両方のIDで構成される複合主キーを作成できます。
Jaap

8

このテーブルを他のテーブルに結合する必要がありますか?レコードを一意に識別する方法が必要ですか?答えが「はい」の場合、主キーが必要です。データが、顧客である人々の名前を含む顧客テーブルのようなものであると想定します。このSally SmithがSally Smithと異なるかどうかを判断するためにアドレス、電子メール、電話番号などが必要であり、その人物が複数の電話を持つことができるため、その情報を関連テーブルに保存するため、自然なキーがない場合があります。 、メールなど。サリー・スミスがジョン・ジョーンズと結婚し、サリー・ジョーンズになったとします。テーブルに人工キーがない場合、名前を更新すると、結婚して名前を変更したのに、7つのSally SmithsがSally Jonesに変更されました。

あなたはあなたが自然な鍵を持っていないと言っているので、一意にするためのフィールドの組み合わせもありません。これは人工的な鍵を重要にします。

自然キーがない場合はいつでも見つかります。人工キーは、データの整合性を維持するための絶対必要です。自然キーがある場合は、代わりにそれをキーフィールドとして使用できます。しかし、個人的には、自然キーが1つのフィールドでない限り、私は自然キーの人工キーと一意のインデックスを好みます。入れないと後悔します。


7

追加するだけで、後で追加しなかったときは残念になります(選択、削除、リンクなど)。


6

すべてのテーブルにPKを設定することをお勧めしますが、必須ではありません。ほとんどの場合、必要に応じて、一意のインデックスやクラスター化インデックス(PKかどうかにかかわらず)が必要になります。

Books Online(SQL Server用)の主キーとクラスター化インデックスのセクションを確認してください。

" PRIMARY KEY制約は、テーブル内の行を一意に識別する値を持つ列または列のセットを識別します。テーブル内の2つの行が同じ主キー値を持つことはできません。主キー内の列にNULLを入力することはできません。主キーとして列整数、小さなを使用することをお勧めします。各テーブルに主キーを有するべきである。主キー値として適格列または列の組み合わせを候補キーと呼ばれます。

しかし、これもチェックしてくださいhttp : //www.aisintl.com/case/primary_and_foreign_key.html


1
これも確認してください、sql-server-performance.com
2006

4
そのページはかなり愚かです。まず、パフォーマンス上の理由から主キーが必要です。彼のページを読むと、本のテキストが一意であるため、本のテーブルにIDを追加しても役に立たないことがわかります。明らかに、その男はデータベースを操作したことはありませんが、彼が批判していることを理解することにも問題があります。1)PK値が行を参照することを記述したページ2)任意の列のセットで2つのテーブルを結合できます。中毒はありません。学術論文の著者が関係理論の非常に基本を理解していないのは驚くべきことです。
Federico Razzoli、2015年

1
「まず、パフォーマンス上の理由から主キーが必要です」これは正しくありません。PKはパフォーマンスに直接影響しません。PKがないと多くの問題(行の識別、結合など)が生じる可能性がありますが、パフォーマンスはそれらの1つではありません。テーブルでPKを作成すると、SQLサーバーが一意のクラスター化インデックスを作成します。そのインデックスは、PK自体ではなくパフォーマンスに影響します。実際の例として、すべてのクエリには日付範囲があるため(私の場合)、行はテーブルの日付列に物理的に並べられるため、テーブルには日付列にクラスター化インデックスがあり、GUIDフィールドにはPKがあります。
endo64

そのクラスター化インデックスは、SQL Serverと他のいくつかのDBMSによって作成された主キーの一種です。それを使用することは良い考えですか?たとえば、MySQLでは、これはいくつかの文書化されていない理由によるものではありません。
Federico Razzoli 2017年

1
InnoDBでは、GUIDはPKの最適なタイプではないことに注意してください。すべてのインデックスにはPKへの参照が含まれているため、大きいほどPKになり、大きいほど他のすべてのインデックスになります。
Federico Razzoli 2017年

6

提案された回答に同意しません。簡単に言えば、いいえです。

主キーの目的は、別のテーブルとの関係を形成するために、テーブルの行を一意に識別することです。従来、この目的のために自動インクリメントされた整数値が使用されていますが、これにはバリエーションがあります。

ただし、たとえば時系列データのロギングでは、そのようなキーの存在が単に必要でなく、メモリを占有する場合があります。行を一意にすることは単純に...必要ありません。

小さな例:表A:LogData

Columns:  DateAndTime, UserId, AttribA, AttribB, AttribC etc...

主キーは必要ありません。

表B:ユーザー

Columns: Id, FirstName, LastName etc. 

LogDataテーブルの「外部キー」として使用するために必要な主キー(Id)。


3

.NETでgridviewの特定の機能を使用するには、gridviewがどの行を更新/削除する必要があるかを知るために主キーが必要であることを知っています。一般的な方法は、主キーまたは主キークラスタを用意することです。私は個人的に前者を好みます。


3

それを将来の証明にするために、あなたは本当にすべきです。それを複製したいなら、あなたはそれを必要とするでしょう。あなたがそれを別のテーブルに参加させたいなら、あなたの人生(そして来年それを維持しなければならない貧しい愚か者のそれ)はとても簡単になるでしょう。


私はそれが必要であるとはまだ確信していませんが、「そうしないと誰かが後で結果に対処しなければならないのでそれを行う」で私はそれをやる側に誤解させるのに十分です。列を縮小してみる価値があると思われる場合は、いつでも後で列を削除できます...
ArtOfWarfare

2

たとえ最初はまだその目的を考えていなくても、私は常に主キーを持っています。PKのないテーブルに最終的にPKが必要になることが何度かありましたが、後でPKを入れるのは常により困難です。常に1つ含めることには、もっと良い面があると思います。


2

私は、オフショア開発チームが作成したアプリケーションを維持する役割を担っています。元のデータベーススキーマの一部のテーブルにPRIMARY KEYSが含まれていなかったため、アプリケーションにあらゆる種類の問題が発生しています。だからあなたの貧弱なデザインのために他の人を苦しめないでください。テーブルに主キーを置くことは常に良い考えです。


1

つまり、いいえ。ただし、特定のクライアントアクセスCRUD操作では必要になることに注意してください。将来の証明のために、私は常に主キーを利用する傾向があります。


1

Hibernateを使用している場合、主キーなしでエンティティを作成することはできません。この問題は、プレーンなsql / ddlスクリプトで作成された既存のデータベースを使用していて、主キーが追加されていない場合に問題を引き起こす可能性があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.