私は最近、湖の測定値のために大量のデータ サンプルを管理しなければならないプロジェクトに取り組みました。このプロジェクトでは、次のようなテーブルがありました。ここにrecords
は、場所とアップローダーごとの湖の測定値のコレクションがありsamples
、実際の湖の測定値 (温度や強度など) が含まれています。
CREATE TABLE records(
email TEXT REFERENCES users(email),
lat DECIMAL,
lon DECIMAL,
depth TEXT,
upload_date TIMESTAMP,
comment TEXT,
PRIMARY KEY (upload_date,email)
);
CREATE TABLE samples(
date_taken TIMESTAMP,
temp DECIMAL,
intensity DECIMAL,
upload_date TIMESTAMP,
email TEXT,
PRIMARY KEY(date_taken,upload_date,email),
FOREIGN KEY (upload_date,email) REFERENCES records(upload_date,email)
);
samples
に依存する弱いエンティティとしてモデル化されましたrecords
。ご存知のように、これはすべての外部キーが から継承records
され、 の 1 つの行を識別するために使用されることを意味しsamples
ます。しかし、代わりにエンティティにすることにした場合はどうなるでしょうか? いくつかの異なる方法で見ることができます。
からの主キーはrecords
存在せずsamples
、あなたが提案するように、ある種の任意の自動インクリメント タイプ ID を割り当てる必要があります。各レコードには数千のサンプルが含まれており、ユーザーはサンプルを現場で記録したレコードの一部と考えています。彼らはレコードごとにサンプルを参照することを期待し
samples
ているため、実際に属するレコードへの明確なマッピングがない非常に大きなテーブルができます。
または、単に弱いエンティティとしてモデル化するのではなく、行でそれ自体を識別できるようにする必要があることを認識しているため、 andrecords
を割り当てます。これら 2 つのエントリを外部キーにすると、気付かないうちに弱いエンティティが作成されてしまいます。そうでない場合は、データベースが行うのではなく、アプリケーション層がとが にも存在することを確認する責任を負う必要があります。upload_date
email
upload_date
email
records
この場合、samples
脆弱なエンティティ (主キーに外部キーを含む) を作成するのが最も簡単なオプションです (そして最も理にかなっています)。
概要
エンティティが実際に弱い場合は、エンティティを弱いものとしてモデル化する必要があります。エンティティ自体を識別するために別のキーの一部を必要とする (主キーの一部である外部キーを持つ) エンティティがある場合、そのエンティティはおそらく脆弱です。
弱いエンティティを使用しないようにシステムを改造できますか? おそらく、関連付けられていないサンプルが必要な場合は、それらのupload_date
and をemail
null にすることができる必要があります。つまり、それらは主キーになく、弱いエンティティにはなりません。1で説明したようなことをしなければなりません。