どのような属性を利用できますか?あなたのアプリケーションはどれを気にしますか?たとえば、まったく同じ場所でまったく同じ秒に2人が生まれることはできませんが、おそらくそのレベルの精度でそのデータにアクセスすることはできません。したがって、モデリングする属性から、許容可能なレベルのデータ整合性を提供するのに十分な属性を決定する必要があります。どちらを選択しても、選択したデータの整合性の側面(同じ人物に複数の行が挿入されないようにする)に焦点を当てることができます。
他のテーブルの結合/外部キーの場合は、代理キーを使用するのが最適です。
私は、主キーという単語の使用を誤称、またはせいぜい混乱させるものと見なすようになりました。主キー、代替キー、一意キー、または一意インデックスとしてフラグを立てているかどうかに関係なく、すべてのキーは引き続きキーであり、テーブルのすべての行にキーの属性の一意の値が含まれている必要があります。その意味で、すべてのキーは同等です。さらに重要なのは(最も)、それらが自然キー(意味のある実ドメインモデルのデータ属性に依存)であるか、代理(実データ属性の独立)であるかです。
次に、キーの使用目的も重要です。代理キーは狭くて単純で、変更されることはありません(理由はありません-何も意味しません)。したがって、結合または他の依存関係の外部キーに適しています。テーブル。
しかし、データの整合性を確保し、同じドメインエンティティに複数の行が挿入されるのを防ぐために、それらはまったく役に立ちません...そのためには、利用可能なデータから選択され、アプリケーションがモデリングしているある種の自然キーが必要です。いくつかの目的。
キーは100%不変である必要はありません。(例として)名前と電話番号と生年月日を使用する場合、たとえば、人が名前や電話番号を変更した場合でも、テーブルの値を変更するだけで済みます。キー属性に新しい値が含まれている行が他の行にない限り、問題はありません。
選択したキーが99.9%のケースでしか機能しない場合でも(同じ名前と電話番号の2人に遭遇し、偶然に同じ日に生まれたとしましょう)、少なくとも99.9%のケースでデータは正確で一貫性があることが保証されます。たとえば、誕生日に時間を追加して一意にするか、キーに他の属性を追加して区別することができます。変更のためにデータベース全体で外部キーのデータ値を更新する必要がない限り(他の場所でこのキーをFKとして使用していないため)、重大な問題に直面することはありません。