我的老师告诉我,以下代码是一对一关系的示例:
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));
第二个示例是一对一关系还是第一个示例?
答案 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表中也应该是唯一的。