0

我有一个作业(因此请相应地回答),其中包括 Animals 和 Zookeepers 之间的多对多关系,并且我设置了我的 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)。我也有一个零或多对一或多的关系来表示,这是否与上述相同?

在此先感谢,正如我所说的那样,这是一项任务,所以不要为我做,只需检查一下,一些指针会有所帮助:p

4

1 回答 1

3

这是一个适当的多对多设置。对于 0/1 对多,您只需消除 animal_zookeeper 表,并将关系移动到父动物和/或 zookeeper 表之一,例如:

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

这将允许一个动物园管理员被分配给一只动物,但同一个动物园管理员可以有多个动物分配给他们。如果您要求动物拥有 zookeeper,则 zookeeper 字段为“not null”。如果你想拥有没有 zookeeper 的“孤儿”动物,你可以在 zookeeper 字段中允许空值。


编辑:集合论

将您的两个表视为记录集:一组动物园管理员和一组动物。

这是 1:many 的设置,其中动物是很多的,而动物园管理员是其中的一个。请注意,“一个”并不意味着只有一个动物园管理员。x:y 的东西是指表中的记录。一个动物园管理员记录可以有许多指向它的动物记录。这并不意味着你有一个动物园管理员来照顾整个动物园。

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

 table zookeepers {
     id
 }

如果您有动物园管理员“John”和“Jane”,那么任何给定的动物都可以分配给他们中的任何一个(或两者都没有)。

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

所以约翰在照顾老虎和豹子(一个动物园管理员,很多动物),简有大象(一对多,碰巧是一对一),猴子独自一人,没有人。但是你永远不会得到John: monkey + Jane: monkey,因为这些动物只能有一个动物园管理员分配给它们。

要执行 one:many,意味着没有孤儿动物,您可以将您的动物更改为:

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

现在猴子不能有“没有人”,因为数据库强制你为猴子分配一个动物园管理员。它仍然是 1:m,但您现在已经不允许 0:m 的情况。

1:m “恰好存在一个 X 可以分配多个 Y”。例如,一个动物园管理员可以处理多只动物,但每只动物只能分配一个动物园管理员。反之亦然 - 一只动物可以有多个饲养员,但每个饲养员只能有一只动物

米:米:敞开的,多种动物以不同的组合与多个动物园管理员相关联。这是最灵活的设置,允许任意组合 zookeeper:animal 关系。但它的副作用是很难防止 0:m 的情况,而不在 zookeeper_animal 表上添加 CHECK CONSTRAINTS,并非所有数据库都支持(例如 mysql)。

于 2013-01-05T19:21:56.540 回答