Php 多对一关系?

Php 多对一关系?,php,mysql,yii,one-to-many,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)

下面是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)
)

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

这里的这一行:
部门ID TINYINT UNSIGNED NOT NULL
注释“约束外键(部门id)引用部门(id)”
引用部门表的
id
字段。在
Department
中,每个部门只能有一个实例,但在
Employee
中,许多员工可能在同一个部门,因此这是
Department->Employee
中的一对多


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

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

一个简单的规则是,如果外键本身是其自己表中的主键,则关系可能是1对1,而如果外键不是其自己表中的主键,则关系可能是1对多,其中表的外键位于“多”端

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

但是,在您引用的示例中,两个表(stock和stock_detail)都使用stock_id作为主键。在这种情况下,可以建立“1对1”关系


考虑这一点:stock和stock_detail表都只包含一条记录,该记录的特定值为stock_id.

好的,但是在这种情况下,我不理解为什么下面的链接描述的是一对一的关系。由于
stock\u detail
正在定义对
stock
的外键约束。。。这不是使它从
stock->stock\u detail
变成了一对多的关系吗?为什么链接是1-1而我的示例是1-Many?在您提供的链接中,左表中的id也是右表中的主键。这意味着左表中只能存在一个id,右表中也只能存在一个id。不过,你很少会使用1对1的关系。如果您认为您需要它,请停下来仔细检查您的数据结构,看看这是否真的是最好的解决方案,或者咨询其他人。这可能是正确的解决方案,但您最好确定一下,否则它会在稍后再次攻击您?它只是一个注释,不是约束,不是指向其他表的链接,什么都没有。从服务器的角度来看,只是一团被忽略的文本。请阅读该语句的语法。@Difster Aaah!可以我想那一分钱刚刚掉了。因此,如果两个键都是主键(或唯一键),那么它是1对1。如果左键是唯一的,右键不是唯一的,则它是一对多。但是如果左键不是唯一的,右键是唯一的,那么它是多对1。对吗?对,对。但是你也必须小心1对多和多对多,如果你不小心,它们也会给你带来麻烦。仅供参考-你可能不应该使用tinyint作为部门ID,你会遇到麻烦的。只需使用Int。这些表之间没有定义关系。阅读该语句的语法。@axiac原则上你是对的,但是yii框架阅读
comment
,并用于自动定义关系。在mkyong.com的示例中,外键可以在任意一个表中定义,而不会产生太大影响,这是真的吗?在上面的例子中。。。如果我让
Department
定义
Employee
表的外键,这真的很重要吗。。。我的意思是,只要键的属性(主键与否)在两端保持不变,就必须定义Employee(Employee.departmentID到Department.ID)之间的外键关系。很简单,你打算如何建立部门与员工之间的关系?员工的主键是ID,但您不能将部门ID引用到员工ID,对吗?如果你指的是一个非主键字段,那么这个关系至少对我来说毫无意义。我明白了。因此,基本上外键必须引用唯一的键,无论它是否为主键。在上述情况下,
Employee
表中的
departmentId
列不是唯一的。。。因此,`Department表中的
id
无法引用它。这是真的吗?我试过了,实际上我们可以建立这样的关系。但问题是什么?因此,我认为只引用主键/唯一键是明智的。