0

動物と動物園の飼育係の間の多対多の関係を含む割り当てがあり(それに応じて答えます)、次のようにこの関係を作成するようにSQLを設定しました。

CREATE TABLE Animal
( 
    animalID VARCHAR(5) NOT NULL PRIMARY KEY,
    -- more rows created here;
);

CREATE TABLE Zookeeper 
( 
    employeeID VARCHAR(5) NOT NULL PRIMARY KEY,
    -- more rows created here;
);

CREATE TABLE Animal_Zookeeper
(
    animal_id VARCHAR(5) NOT NULL,
    employee_id VARCHAR(5) NOT NULL,
    PRIMARY KEY (employee_id, animal_id)
);

-- insert data to Animal/Zookeeper tables

ALTER TABLE Animal_Zookeeper
    ADD CONSTRAINT FK_Animal_Zookeper_Relation_1
    FOREIGN KEY (animal_id)
    REFERENCES Animal(animalID)
    ON UPDATE RESTRICT
    ON DELETE RESTRICT,
    ADD CONSTRAINT FK_Animal_Zookeeper_Relation_2
    FOREIGN KEY (employee_id)
    REFERENCES Zookeeper(employeeID)
    ON UPDATE RESTRICT
    ON DELETE RESTRICT;

これがこの関係を表す正しい方法であるかどうか、またはこれがどのように動作するかについて完全に自信がないために何かを見逃していないかどうかを確認したいと思います(いくつかの説明があればいいでしょう:D)。私はまた、表すためにゼロ以上から1つ以上の関係を持っています、それは単に上記と同じ方法で行われますか?

事前に感謝します。私が言ったように、それは割り当てのためですので、私のためにそれをしないでください。ちょっとしたチェックといくつかのポインタが役に立ちます:p

4

1 に答える 1

3

これは適切な多対多の設定です。0/1対多の場合、animal_zookeeperテーブルを削除し、関係を親動物および/またはzookeeperテーブルの1つに移動します。例:

table animal {
  ...
  zookeeper foreign key ...
}

これにより、1匹の飼育係を動物に割り当てることができますが、同じ飼育係に複数の動物を割り当てることができます。動物に飼育係が必要な場合、飼育係のフィールドは「nullではありません」です。Zookeeperのない「孤立した」動物が必要な場合は、zookeeperフィールドでnullを許可します。


編集:集合論

2つのテーブルをレコードのセットとして表示します。動物園の飼育係のセットと動物のセットです。

これは1:manyの設定で、動物が多く、飼育係が1人です。「1つ」とは、飼育係が1人だけという意味ではないことに注意してください。x:yのものは、テーブル内のRECORDSを参照します。1つの動物園飼育係の記録には、それを指す多くの動物の記録を含めることができます。動物園全体の世話をする飼育係が1人いるという意味ではありません。

 table animals {
     id
     zookeeper foreign key (zookeepers.id) default null
 }

 table zookeepers {
     id
 }

動物園の飼育係「ジョン」と「ジェーン」がいる場合は、どの動物にもどちらか(またはどちらも)を割り当てることができません。

 (many)    (one/none)
 tiger     John
 leopard   John
 monkey    (null)    <--monkey is orphaned, with no zookeeper assigned.
 elephant  Jane

つまり、ジョンはトラとヒョウ(1匹の動物園の飼育係、多くの動物)の世話をしており、ジェーンは象(1匹:偶然に1:1になることが多い)を持っており、サルは一人で誰もいません。しかしJohn: monkey + Jane: monkey、動物には動物園の飼育係を1人しか割り当てることができないため、取得することはできません。

one:manyを強制するには、孤立した動物がいないことを意味し、動物を次のように変更します。

table animal {
   id
   zookeeper foreign key (zookeepers.id) NOT NULL
                                        ^^^^^^^^^
}

データベースでは、動物園の飼育係をサルに割り当てるように強制されているため、サルは「誰も」持つことができなくなりました。まだ1:mですが、0:mの場合は許可されていません。

1:m「複数のYを割り当てることができるXが1つだけ存在する」。たとえば、1人の飼育係が複数の動物を扱うことができますが、各動物に割り当てることができる飼育係は1人だけです。またはその逆-1匹の動物は複数の飼育係を持つことができますが、各飼育係は1匹の動物しか持つことができません

m:m:大きく開いた、複数の動物園の飼育係とさまざまな組み合わせで関連付けられた複数の動物。これは最も柔軟な設定であり、動物園の飼育係と動物の関係を任意に組み合わせることができます。ただし、その副作用は、すべてのデータベースがサポートしているわけではないzookeeper_animalテーブル(mysqlなど)にCHECK CONSTRAINTSを追加せずに、0:mの状況を防ぐことが難しいことです。

于 2013-01-05T19:21:56.540 に答える