多对一的关系?

时间:2017-07-26 07:37:36

标签: php mysql yii one-to-many

以下MySQL代码......

CREATE TABLE Employee (
    id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    departmentId TINYINT UNSIGNED NOT NULL
        COMMENT "CONSTRAINT FOREIGN KEY (departmentId) REFERENCES Department(id)",
    firstName VARCHAR(20) NOT NULL,
    lastName VARCHAR(40) NOT NULL,
    email VARCHAR(60) NOT NULL,
    ext SMALLINT UNSIGNED NULL,
    hireDate TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    leaveDate DATETIME NULL,
    INDEX name (lastName, firstName),
    INDEX (departmentId)
)

CREATE TABLE Department (
    id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    name VARCHAR(40),
    UNIQUE (name)
)

...定义员工与部门之间的多对一关系。换句话说,一个员工只能在一个部门,但一个部门可以有很多员工。但有人可以更详细地解释一下吗?以上代码如何告诉我?

2 个答案:

答案 0 :(得分:1)

这一行:departmentId TINYINT UNSIGNED NOT NULL COMMENT "CONSTRAINT FOREIGN KEY (departmentId) REFERENCES Department(id)"指的是Department表的id字段。在Department中,您只能拥有每个部门的一个实例,但在Employee中,许多员工可能在同一个部门,因此Department -> Employee

中的一个到多个

这有意义吗?此外,如果您要更改部门本身的名称,则无需更新Employee表中的任何内容,因为它会自动引用回Deparment表。

答案 1 :(得分:0)

通过查看引用表的外键,有时很容易辨别两个(或更多)表之间的关系。

一个简单的规则是,如果外键在其自己的表中是主键,则该关系可能是1比1,而如果外键不是其自己的表中的主键,则该关系可能为1对很多人来说,桌子上的外键位于"很多"端。

在您的示例中,对于Employee中的departmentID,它不是主键。因此,在这种情况下,许多员工可以同时引用一个部门,因此,#1; 1到多个"可以建立关系。

但是,在引用的示例from mkyong.com中,两个表(stock和stock_detail)都使用stock_id作为主键。在这种情况下," 1到1"可以建立关系。

考虑一下:stock和stock_detail表只包含一个具有特定值的单个记录作为stock_id。 I made a sample here