一个表中两列之间的外键关系

时间:2012-09-10 17:14:47

标签: 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是说明中包含的信息,commentusername添加的内容。 comment将始终包含某些内容,并且不一定与之前的用户相同。

这个概念是有人可以“复制”一个音符并有自己的评论,并说“我从xxx得到了这个音符”,因此是亲子关系。有点像在Facebook上分享,或许。

如何正确构建parent_ID列?我应该使用识别关系;哪一方是强制性的? 我认为这必须是一对多的关系,因为五个人可以复制相同的音符。

我希望复制比创建新笔记更多,因此记录中会有相对较少的NULL,但要完全删除空值,我应该应用{{1}约束并简单地使默认父NOT NULL0处具有基本无意义的记录,并在软件中注意这一点?

这甚至是正确的方法吗?我应该使用双表系统:

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)

由于

1 个答案:

答案 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)
);