我正在构建一个数据库表,表示在其中两列中具有父子关系的“注释”,如下所示:
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
,但要完全删除空值,我应该应用{{1}约束并简单地使默认父NOT NULL
在0
处具有基本无意义的记录,并在软件中注意这一点?
这甚至是正确的方法吗?我应该使用双表系统:
ID 0
和
ID INT(10) PK
information VARCHAR(256)
orig_user VARHCAR(30) FK -- Potentially
通过definiton消除了任何可能的ID INT(10) PK FK
username VARCHAR(30) PK FK
comment VARCHAR(256)
?
由于
答案 0 :(得分:4)
我应该使用识别关系
不,只有ID
应该在PK中,因为单独是唯一的。此外,根(无父)注释将具有NULL parent_ID
并且NULL不能在PK中。
我认为这必须是一对多的关系,因为五个人可以复制相同的音符。
正确。它也是一棵树,因为可以有多个级别的复制。
...我应该应用NOT NULL约束并简单地使默认父0在ID 0处具有基本无意义的记录,并在软件中注意这一点吗?
如你所知,不需要,FK仍会在0上执行,你需要一个“虚拟”行来满足它。 FK忽略NULL,所以只需在根音符parent_ID
中放置一个NULL。
我应该使用双桌制......
这不会模仿同样的事情。它只允许您连接到原始用户,但不能连接到原始用户。
如果单个音符可以有多个父母,那么不同的双表设计是可行的,但这似乎并非如此。
通过definiton消除任何可能的NULL?
你似乎非常想消除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)
);