我正在构建一个数据库表,表示一个“注释”,它在其中的两列中具有父子关系,如下所示:
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
其中 username
是 user
表的外键,是写笔记的人的用户名,information
是信息注释和 comment
中包含的是 username
添加的内容。 comment
总会有一些东西在里面,不一定和之前的用户一样。
这个概念是有人可以“复制”一张纸条并发表自己的评论,然后说“我从xxx那里得到了这张纸条”,因此形成了亲子关系。也许有点像在 Facebook 上分享。
如何正确形成 parent_ID 列?我应该使用识别关系吗?哪些方面是强制性的? 我认为这必须是一对多关系,因为五个人可以复制同一条笔记。
我希望复制的次数多于创建新笔记的次数,因此记录中的 NULL
数量相对较少,但要完全消除空值,我应该应用 NOT NULL
约束并简单地使默认父级 0
在 ID 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/