mysql - strategy - spring jpa id null




ユーザーのテーブルにID列があるのはなぜですか。 (4)

この識別子は代理キーとして知られています。 私がリンクしたページは長所と短所の両方をリストします。

実際には、スーパーキーのデータでも時間の経過とともに変化する可能性があるため(つまり、ユーザーの電子メールアドレスが変化し、対応する関係変化する必要があるため)有利です。価値は関係に無意味です。

それはvarcharよりも小さいキー長を持つ整数になることができるので、 JOIN観点からもいいでしょう。

私は実際にそれらを使用することを好むと言うことができます。 開発中の要件の変更により、複数列の主キーまたはテーブルをまたがって使用されるデータ代表スーパーキーを後で一意でないものにしなければならないことが多すぎるのですが、これは対処したくない状況です。

各ユーザーについて別の固有の情報がすでにあること、そしてそれがユーザー名であることは明らかです。 それでは、なぜ各ユーザーに別のユニークなものが必要なのでしょうか。 各ユーザーのIDも必要です。 id列を省略するとどうなりますか?


ユーザー名が一意であっても、varcharを主キーとして使用するのではなく、追加のid列を使用することにはほとんど利点がありません。

  • 整数列を主キーとして使用し、他の列が変更される可能性があっても変更する必要がない代理キーとして機能することを好む人もいます。 自然主キーも変更可能であることを妨げるものは何もありませんが、関連するテーブルの外部キーがそのような変更と同期して更新されるようにするためにカスケード外部キー制約を使用する必要があります。

  • varcharの代わりに32ビット整数である主キーは、スペースを節約できます。 ユーザーテーブルを参照する他のすべてのテーブル内のintまたはvarchar外部キー列の間の選択は、正当な理由になります。

  • 主キーインデックスへの挿入は、インデックスの末尾に新しい行を追加すると、インデックスの途中にそれらを挿入するよりも少し効率的です。 MySQLテーブルのインデックスは通常B + Treeデータ構造であり、それらがどのように機能するかを理解するためにこれらを研究することができます。

  • 一部のアプリケーションフレームワークでは、データベース内のすべてのテーブルに、自然キーや複合キーを使用するのではなく、 idという主キー列があるという規則が好まれます。 このような規則に従うことで、特定のプログラミング作業が簡単になります。

これらの問題のどれも取り引きを破るものではありません。 また、自然キーを使用する利点もあります。

  • IDで検索するよりもユーザー名で行を検索する頻度が高い場合は、ユーザー名を主キーとして選択し、InnoDBのインデックス構成のストレージを利用する方が良い場合があります。 可能であれば、主検索列を主キーにします。これは、主キー検索がInnoDBのほうが効率的であるためです(MySQLではInnoDBを使用する必要があります)。

  • お気づきのように、すでにusernameに独自の制約がある場合は、不要な余分なid列を保持するのはストレージの浪費のようです。

  • 自然キーを使用すると、外部キーには任意の整数IDではなく、人間が読める値が含まれます。 これにより、クエリは「実際の」値のために親テーブルに結合し直す必要なしに外部キーの値を使用することができます。

重要なのは、100%のケースをカバーするルールがないということです。 単一のデータベースでも、オプションを開いたままにして、自然キー、複合キー、および代理キーを使用することをお勧めします。

私の本「 SQL Antipatterns:Database Programmingの落とし穴を避ける 」の「必要なID」の章で代理キーの問題をいくつか取り上げます


私たちが持っているim mysql。

 1:Index fields 2:Unique fields and 3:PK fields.
index means pointable
unique means in a table must be one in all rows.
PK = index + unique

テーブルには、次のようなたくさんのユニークなフィールドがあります。
ユーザー名またはパスポートコードまたはEメール。
しかし、あなたはIDのようなフィールドが必要です。 それはユニークでもインデックス(= PK)でもあります。最初のものは常に1つのもので変化しないもので、2番目のものはユニークで3番目のものは単純です(数字が多いため)。


私の意見では、すべてのテーブルは一意の自動インクリメントIDを持つべきです。

ここにいくつかの実用的な理由があります。 重複する行がある場合は、どの行を削除するかを簡単に決めることができます。 行が挿入された順序を知りたい場合は、IDにその情報があります。 ユーザーに関しては、世界には "John Smith"以上のものがあります。 idは外部参照のためのキーを提供します。

最後に、名前、住所、電話番号、電子メールアドレスなど、ユーザーを説明するものすべてが時間の経過とともに変わる可能性があります。







database