mysql - 创建父子表,child 是否需要自己的主 id 列?

标签 mysql sql database relational-database

我们在创建父子表时,子表是需要自己的主键,还是应该使用父表的外键作为主键?

例子:

我有一个存储用户的表,其定义如下:

CREATE TABLE users (
    'id' bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
    'username' varchar(32),
    PRIMARY KEY ('id'))

我想制作第二张表来存储更多关于用户的信息,比如他们最喜欢的动物。该表是否应该有自己的“id”列以及链接用户的单独外键?:

CREATE TABLE users_extra_info (
    'id' bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
    'fk_user_id' bigint(20) UNSIGNED NOT NULL,
    'fav_mammal' varchar(32),
    'fav_reptile' varchar(32),
     ...
    PRIMARY KEY ('id'),
    KEY 'fk_user_id' ('fk_user_id'))

或者由于外键必须是唯一的,您通常只是删除“id”列吗?:

CREATE TABLE users_extra_info (
    'fk_user_id' bigint(20) UNSIGNED NOT NULL,
    'fav_mammal' varchar(32),
    'fav_reptile' varchar(32),
     ...
    PRIMARY KEY ('fk_user_id'))

谢谢

最佳答案

原则上,与其他表无关,每个表都应该有一个PRIMARY KEY,以便您能够区分一行与另一行。虽然并不总是需要绝对标识通常需要的各个行。

如果是真正的一对一关系(或一对零或一关系,也会发生),因为外键必然是唯一的它也可以用作主键的子表。在这种情况下,绝对没有理由引入第二个唯一列。

但是,一对一和一对零或一的关系不如一对多关系常见。在这种更常见的情况下,您不能只使用外键列作为主键,因为它们在子表中不是唯一的。在这种情况下,您可以选择引入一个额外的整数键或使用外键列和一个或多个其他列创建一个复合主键,这些列一起保证是唯一的。

关于mysql - 创建父子表,child 是否需要自己的主 id 列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22702657/

相关文章:

mysql - 在未来 x 天而不是周末插入 MySQL 日期

php - MySQL中不重复记录的随机数据列表

java - java spring 微服务中的 postgres 不显示数据

php - 获取刚刚使用 MySQL 插入的行的自动编号 ID

mysql - 我一生都无法理解问题所在

c# - 有没有支持C++和C#的ORM(Object Relational Mapper)框架

php - 如何从 MySQL 的多个表中选择最小的数字?

php - 如何使用mysql从具有父子关系的表中检索数据?

php - Doctrine2 多对多逆向查询生成器

sql - PostgreSQL 按照 IN 条件传递的顺序获取记录