mysql - 一张表中两列之间的外键关系

标签 mysql database-design

我正在构建一个数据库表,表示一个“注释”,它在其中的两列中具有父子关系,如下所示:

ID           INT(10) PK NOT NULL UNSIGNED ZEROFILL AUTOINCREMENT  -- Primary key
parent_ID    INT(10) UNSIGNED ZEROFILL                 -- References Primary key
username     VARCHAR(30) NOT NULL
information  VARCHAR(256) NOT NULL
comment      VARCHAR(256) NOT NULL

其中 usernameuser 表的外键,是写笔记的人的用户名,information 是信息注释和 comment 中包含的是 username 添加的内容。 comment 总会有一些东西在里面,不一定和之前的用户一样。

这个概念是有人可以“复制”一张纸条并发表自己的评论,然后说“我从xxx那里得到了这张纸条”,因此形成了亲子关系。也许有点像在 Facebook 上分享。

如何正确形成 parent_ID 列?我应该使用识别关系吗?哪些方面是强制性的? 我认为这必须是一对多关系,因为五个人可以复制同一条笔记。

我希望复制的次数多于创建新笔记的次数,因此记录中的 NULL 数量相对较少,但要完全消除空值,我应该应用 NOT NULL 约束并简单地使默认父级 0ID 0 处有一个基本无意义的记录,并在软件中注意到这一点?

这是正确的方法吗?我是否应该使用一个双表系统:

ID          INT(10)      PK
information VARCHAR(256)
orig_user   VARHCAR(30)  FK  -- Potentially

ID          INT(10)      PK FK
username    VARCHAR(30)  PK FK
comment     VARCHAR(256)

哪个根据定义消除了任何可能的 NULL

谢谢

最佳答案

Should I use an identifying relationship

不,只有 ID 应该在 PK 中,因为它单独 是唯一的。此外,根(无父级)注释将有一个 NULL parent_ID 并且 NULL 不能出现在 PK 中。

I figure this has to be a 1-to-Many relationship since five people can copy the same note.

正确。它也是一棵树,因为可以有多个级别的复制。

... should I apply a NOT NULL constraint and simply make the default parent 0 with an essentially meaningless record at ID 0 and take note of this in the software?

不需要,FK 仍然会在 0 上强制执行,您需要一个“虚拟”行来满足它,正如您已经指出的那样。 FK 忽略 NULL,因此只需在根注释的 parent_ID 中放置一个 NULL。

Should I employ a two-table system...

这不是同一件事的模型。它只允许您连接到原始用户,而不是原始笔记。

如果单个笔记可以有多个父节点,不同的双表设计是可行的,但这里似乎不是这种情况。

Which eliminates any possible NULL's by definiton?

您似乎很想消除 NULL。有什么理由吗?


总而言之,您应该只在一张表中存储笔记,如下所示:

CREATE TABLE note (
    ID           INT(10) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    parent_ID    INT(10) UNSIGNED,
    username     VARCHAR(30) NOT NULL,
    information  VARCHAR(256) NOT NULL,
    comment      VARCHAR(256) NOT NULL,
    FOREIGN KEY (parent_ID) REFERENCES note (ID),
    FOREIGN KEY (username) REFERENCES `user` (username)
);

关于mysql - 一张表中两列之间的外键关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12356458/

相关文章:

mysql - 用值填充 LEFT JOIN 中的 NULL

多表表连接的Mysql查询问题

php - Ajax MYSQL 搜索和排序结果

sql-server - 如何为用户定义字段(UDF)设计数据库?

C# & MySQL 多字段搜索

C# 检查查询是否返回空集不起作用?

postgresql - 如何将具有 n 列的表映射到数据库?

mysql - 复杂查询的 View 或存储过程?

python - 将抓取的 .csv 文件从 AWS EC2 导出到 AWS MYSQL 数据库

mysql - 标签系统和评分系统