我的老师告诉我下面这段代码是一对一关系的一个例子:
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));
第二个示例是一对一关系还是第一个?
最佳答案
您的评估是正确的。您强制 ID_PERSON 唯一的第二个选项是 1:1 关系。干得好。
您的评估也是正确的,第一种方法允许同一个人使用多个短语,这变成了 1:many 关系。
替代理论
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 + phrase_id 设为主要来扩展到 many:many。
关于mysql - 这是一对一的例子吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53643929/