mysql - 这是一对一的例子吗?

标签 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));

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

最佳答案

您的评估是正确的。您强制 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/

相关文章:

mysql - MySQL SQL 查找给定范围内的数字

sql - 两个sql查询之间的减法

mysql - 如何使用存储过程从多个数据输入返回两个日期之间的数据

sql - 验证 SQL 查询和结果集

mysql - 我想在 MySQL 中连接五个表

php - 检查每一行来自哪个表

php - 从数据数组中计算和搜索字符串

php - mysql 从多个表中选择,即使一个表不包含 where 子句

java - 在 MySQL 表中查找列时出错

c# - 创建没有自动增量 ID 的 Entity Framework 表