这是一对一的例子吗?

时间:2018-12-06 02:56:53

标签: mysql sql

我的老师告诉我,以下代码是一对一关系的示例:

CREATE TABLE PERSON (ID INT AUTO_INCREMENT, NAME VARCHAR(20) UNIQUE NOT NULL,
CONSTRAINT PK_PERSON PRIMARY KEY (ID));

CREATE TABLE PHRASE (ID INT AUTO_INCREMENT, PHRASE VARCHAR(50) UNIQUE NOT NULL, ID_PERSON INT,
CONSTRAINT PK_PHRASE PRIMARY KEY (ID),
CONSTRAINT FK_PHRASE FOREIGN KEY (ID_PERSON) REFERENCES PERSON(ID));

但是通过这种方式,我可以为同一个人设置两个短语,这使我认为正确的答案如下:

CREATE TABLE PERSON (ID INT AUTO_INCREMENT, NAME VARCHAR(20) UNIQUE NOT NULL,
CONSTRAINT PK_PERSON PRIMARY KEY (ID));

CREATE TABLE PHRASE (ID INT AUTO_INCREMENT, PHRASE VARCHAR(50) NOT NULL UNIQUE, ID_PERSON INT,
CONSTRAINT PK_PHRASE PRIMARY KEY (ID),
CONSTRAINT FK_PHRASE FOREIGN KEY (ID_PERSON) REFERENCES PERSON(ID),
CONSTRAINT FK_PHRASE2 UNIQUE (ID_PERSON));

第二个示例是一对一关系还是第一个示例?

2 个答案:

答案 0 :(得分:0)

您的评估正确。强制ID_PERSON唯一的第二个选项是1:1关系。做得好。

您在评估中也正确地认为,第一种方法允许同一个人使用多个短语,从而成为1:1的关系。

替代理论

create table person (id int primary key, name varchar(20) unique);

create table phrase (id int primary key, phrase varchar(20) unique);

create table person_phrase (person_id int primary key, phrase_id int);

以上内容还将导致人员和词组之间的1:1关系,但将为人员提供单独的表,为短语提供单独的表。只要一个人只有一个短语,就可以将人和短语组合在一起。

此设计允许您从1:1开始并扩展为多对多关系,其中一个人可以有多个短语,而一个短语可以被许多人使用。您可以将person_id + statement_id设置为primary。

答案 1 :(得分:0)

第二个是一对一关系的示例。第一个仅保证引用完整性得到维护。这意味着它将确保PERSON_ID的值应存在于PERSON表中,同时允许您在表中输入多个PERSON ID。

第二个示例具有外键约束以及PERSON ID上的唯一键,这维护了PERSON ID在PHRASE表中也应该是唯一的。