私はデータベースを始めたばかりなので、私の質問は少し不正確に表現されるかもしれませんが、最善を尽くします...私の大学では、Oracle Data Modelerを使用してデータベースをモデル化しています。質問: あるエンティティのプライマリ UID が外部キーとして別のエンティティに渡されるのはいつですか? 私が発見したことから (実験的に、ググることができなかったので...)、2 つのエンティティは 1:1 でバインドされているときに PK を交換しますが、他のタイプのバインディングはどうですか? どちら側がオプションとマークされているキーパッシングにとって重要ですか?
1 に答える
さまざまなタイプの関係とそのマッピングについて学習する必要があります。
私が持っているわずかな知識から、3 種類の関係を以下に示します。
1対1
これは、テーブルの 1 行が他のテーブルの 0 行または 1 行に関連付けられている関係です。理想的には、この関係を 2 つの異なるテーブルに実装しないでください。テーブルは 1 つだけで十分です。例 -
person
とpermanent_address
テーブルがあるとします。ビジネス ルールに従って、個人の恒久的な住所は 1 つしか存在できないと想定しています。したがって、次のことができます。person(personid, firstname, lastname, ...) permanent_address (permanent_addressid, personid, line1, line2, ...)
ここで、
personid
in table は tableの列をpermanent_address
指します。personid
person
外部キーを必須にしたい場合は
NOT NULL
、列に制約を追加できます。多対一
これは、1 つのテーブルの多くの行が他のテーブルの 1 つの行に関連付けられている、より一般的で広く使用されている関係です。
たとえば、1 人の人物が複数の車を所有できるというビジネス ルールがある場合、次のようになります。
person(person_id, first_name, last_name, birthdate, ...) car (licence_plate_number, person_id, carname, ...)
ここで、 in table は
person_id
incar
table を指します。person_id
person
多対多
これは、1 つのテーブルの多くの行が、他のテーブルのゼロ、1 つ、または複数の行に関連付けられる一種の関係です。
たとえば、一人の人が多くの趣味を持つことができます。一つの趣味は多くの人が共有できます。したがって、この関係を次のように実装できます。
person (person_id, first_name, last_name, birthdate, ....) hobby (hobby_id, hobby_name, hobby_type, ...) person_hobby (person_id, hobby_id)
ここで
person_id
、inperson_hobby
table はperson_id
ofperson
table を参照し、hobby_id
in table はof tableperson_hobby
を参照します。この中間テーブルは、この多対多の関係を実装するために必要です。同じ人に同じ趣味を複数回割り当てることを避けるために、複合主キーとして列セット (person_id、hobby_id) に制約を適用できます。hobby_id
hobby
PRIMARY KEY