3

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

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

whereusernameuser表的外键,是写笔记的人的用户名,是笔记中information包含的信息,commentusername添加的内容。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的 's ?

谢谢

4

1 回答 1

4

我应该使用识别关系吗

不,只ID应该在PK中,因为它是独一无二的。此外,根(无父)注释将具有 NULLparent_ID并且 NULL 不能在 PK 中。

我认为这必须是一对多的关系,因为五个人可以复制同一个笔记。

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

...我是否应该应用 NOT NULL 约束并简单地将默认父级 0 设置为在 ID 0 处具有基本上无意义的记录,并在软件中记下这一点?

不需要,FK 仍会在 0 上强制执行,并且您需要一个“虚拟”行来满足它,正如您已经指出的那样。FK 忽略 NULL,所以只需在根音符的parent_ID.

我应该采用两桌系统吗?

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

如果单个音符可能有多个父级,则不同的两表设计将是可行的,但这里的情况似乎并非如此。

哪个按定义消除了任何可能的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)
);
于 2012-09-10T17:48:34.487 回答