不要な場合でも、すべてのテーブルにIDを追加しますか?


8

現在、このIDの使用状況(たとえば、MxNテーブル)が表示されない場合でも、データベースのすべてのテーブルにデフォルトでIDフィールドを追加するのは、この設計の良し悪しですか?


id列がない場合、他のフィールドが主キーを構成しますか?
Thanos Papathanasiou 2011年

別のテーブルで使用されている可能性がある場合は、通常、IDを追加します...少しだけですがスペースを節約します
zfm

回答:


3

多くの場合、すべてのテーブルに人為的なIDがあると非常に便利です。いくつかのケースでは、それはa **の単なる苦痛です。

一般的に、私は取り組んでいるすべてのプロジェクトでそれを行います。

利点:

  • IDtype と呼ばれるキーフィールドですべてのテーブルにアクセスできる場合は、一般にアクセスコードを記述または生成する方が簡単Integerです。

  • 時々、自然キーは揮発性です。たとえば、すでに非常に複雑な倉庫管理システムでは、製品コードが変更されるというタスクに直面していました。たとえば、製品001234は将来的に002345として知られるようになります。残念ながら、そのシステムは人工的なIDを使用しませんでしたが、製品コードを主キーとして使用しました。当然、製品コードは他の何十ものテーブルの外部キーでもありました。そのため、番号の付け替えは非常に困難で費用がかかり、勤務時間中に行うことはできませんでした。ソフトウェアの次のバージョンは人工的なIDを使用したため、製品テーブルに対する単純なUPDATEでした。

  • 場合によっては、本来あるべきキーであっても、自然キーは一意ではありません。私の国では、いくつかの理由により、いくつかのSSNが2回発行されています。

  • 隠されたキーは、データ構造が複雑な場合に扱いにくくなります。4つの部分からなるキーが付いたサブサブサブテーブルを使用すると、作業がかなり面倒になります。

短所:

  • その性質上、これらのIDはシステムの外部では意味がないため、これらのIDを自然なキーに変換するには多くのルックアップが必要です。

  • 上記のサブサブサブテーブルからトップキーを取得するには、階層全体で大きな結合が必要です。

  • 入力データを既存のレコードとマージすることは、さらに多くのルックアップが必要になるため、より困難になります。


2
箇条書き2:これは以前ON UPDATE CASCADEですか?
Izkata

1
@Izkataは、多数のレコードが変更されたときにパフォーマンス/ブロッキング/ロックの問題を引き起こす可能性が非常に高いため、エンタープライズレベルのデータベースの更新カスケードを許可しません。10,000,000のレコードが更新されている間は、ユーザーをロックしたくありません。これが多くの人が揮発性キーが悪いと信じている理由です、それはそれが変更されたときにデータベースであまりにも多くの仕事を引き起こします。
HLGEM、2011年

@HLGEM私が試してみるようなデータベースを持っていなかったことは認めますが、特にすべてのXレコードの更新の間に一時停止が追加された場合、InnoDBの行レベルのロックがそれを軽減するのに役立つようです。その上、ammoQの説明によると、実際の問題は、すべての外部キーを手動で変更する必要があるということでした(たとえば、MySQLのMyISAMエンジンはそれをサポートしていません)。
Izkata

イズカタ:問題は、1つではなく30のupdateステートメントを発行していませんでした。カスケード更新を使用しなくても、その部分は簡単です。実際の問題は、1行ではなく何千行にも影響を及ぼし、システム全体でデッドロックを引き起こしていました(確かに、設計が適切ではありません)。結局、毎晩それを行う仕事がありました。
user281377

1
+1の不利な点:異なる環境間(dev、at、productionなど)でデータを移動するのが困難
Marco Lackovic

6

合成キーと自然キー、および単一キーと複合キーはどちらも、双方に良い面と悪い面がある、活発に議論されているトピックです。それらは、独自の行の議論におけるタブ対スペースおよび中括弧のようなものです。

最も重要なことは、データベース全体で一貫性を保つために、どちらか一方を選んでそれを守ることです。一般的に、すべてのテーブルに適切な自然キーを設定するのは難しく、すべてのテーブルに合成キーがある場合は、一貫性を保つのがはるかに簡単なため、合成キーが使用されます。


4

すべてのテーブルには、PK、一意の識別子、またはIDが必要です。MxNの場合、PK(複合1)があります。したがって、別のものを用意する必要はありません。

関連項目: 多対多テーブルの1つまたは2つの主キー?

関連トピックに関する私の個人的な好み:PKは、PKであること以外に他の用途があってはなりません。したがって、データが「自然に一意」のIEであるとしても、PKのデータは使用しません。SSN、日付、郵便番号など。


1
あなたは自分と矛盾します。リレーションテーブルの複合キーの列には、PK以外の用途もあります。それらも外部キーです。(それに、私は同意しません。あなたが何かを持っている場合、それは当然PKです。私はそれでいいでしょう。私がそれに制約を持っていなかった場合、私は確かにある日競合するエントリになるでしょう。制約があるので、主キーとして使用しないでください。)
Jan Hudec

2
通常、PKはPKの一部であるさまざまなテーブルでFKとして使用されますが、矛盾はありません。
Morons

1
私はナチュラルキーに関するあなたの立場を理解しています。つまり、これが私の個人的な好みであることを慎重に述べた方法です。
Morons

3
@JanHudec:自然にユニークなものは自然に変化する傾向があります。また、私は> PKとして使用する場合にはそのパフォーマンスの問題につながる、文字列のように、自然なキーが非整数である傾向があることがかなり頻繁に見てきた
ゴランJovic

また、PKのタイプミスを処理しなければならない問題にも遭遇します。それは私を夢中にさせていました。
Morons

0

設計の観点からは、自然な複合主キーを使い、合成キーを発明しないでください。存在する必要がないものは、スキーマを理解するのをより複雑にするだけです。

多くのデータベースのパフォーマンスの観点から、他のインデックス付きの列よりも整数の主キーでテーブルにアクセスする方が高速です。これらのデータベースは、このような合成キーを持たないテーブル(通常は「ROWID」または「OID」などと呼ばれる)にも暗黙的に追加するため、明示的に追加してもコストはまったくかかりません。

MxN(リレーション)テーブルの場合、主キーでアクセスしても意味がありません。どちらかのコンポーネントによってそれらにアクセスし、関連するエンティティのセットを反対側から取得します。したがって、これらのテーブルでは、合成主キーを追加しても意味がありません。

適切に構成された、または整数以外の主キーを持つ他のテーブルについては、最初は合成キーを追加しませんが、パフォーマンスが重要なテーブルでアクセスされるテーブルのパフォーマンスチューニング中に追加することを検討します。

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