单表还是多表?

dm7nw8vv  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(351)

我的post表包含以下列:id、user、id、title、message、date
我的评论表包含以下列:id、user\u id、post\u id、message、date
因为这两个表非常相似,所以最好有一个包含以下列的表:
id、用户id、父id、类型、标题、消息、日期
父帖子的每一行都有一个空的父帖子id值,子帖子的每一行都有一个空的标题值。父帖子的类型为1,子帖子的类型为2。
编辑:我也会使用一个评级功能,我会再次问同样的问题,2个特定的后评级和评论评级表,或一个通用评级表。对于ratings表,结构将完全相同,因此没有可为null的字段。评级表也不太可能改变,因为它只知道评级的所有者、实际评级和目标帖子/评论等。

pxyaymoc

pxyaymoc1#

使用单个表将允许您拥有更深层的嵌套继承结构。例如:

title
    comment
    comment2
        comment_to_comment
    comment3
        comment_to_comment2
        comment_to_comment3

因此,这是2表设置中不存在的附加功能。
“我只会在你需要这个功能的时候做”,因为查询会更复杂。在这样的表中添加一个(root\u id)列,以指示嵌套级别大于1的注解标题所在的节点,这也是有益的。
您还可以使用一个表作为数据,一个表作为父/子层次结构(这只是一个示例,您可能需要调整语法)。

create table element (     
    id        serial  not null primary key,
    data      integer not null
);

create table heirarchy (
    id        serial  not null primary key,
    id_root   integer not null references element(id),
    id_parent integer not null references element(id),
    id_child  integer not null references element(id)
);

insert into element (data) values (100);
insert into element (data) values (101);
insert into element (data) values (102);
insert into element (data) values (103);
insert into element (data) values (104);
insert into element (data) values (105);
insert into element (data) values (106);
insert into element (data) values (107);
insert into element (data) values (108);

select id, data from element;

1 | 100
2 | 101
3 | 102
4 | 103
5 | 104
6 | 105
7 | 106
8 | 107
9 | 108

insert into heirarchy (id_root, id_parent, id_child) values (3, 3, 4);
insert into heirarchy (id_root, id_parent, id_child) values (3, 3, 5);
insert into heirarchy (id_root, id_parent, id_child) values (3, 4, 1);
insert into heirarchy (id_root, id_parent, id_child) values (3, 4, 2);
insert into heirarchy (id_root, id_parent, id_child) values (3, 1, 9);
insert into heirarchy (id_root, id_parent, id_child) values (6, 6, 7);
insert into heirarchy (id_root, id_parent, id_child) values (6, 6, 8);

这类事情并不简单,您还可以设置触发器来防止循环关系。

z8dt9xmd

z8dt9xmd2#

我不会这么做,有几个原因:
这两者之间存在子/父关系,对于这样的关系,您有外键和单独的表。
切勿仅因为列的命名相同而使用同一个表。不要试图在这里节省空间,空间并不花费一件东西,但你的时间理解它或改变它以后会。必须解释你的数据库设计(你必须这么做)的结果是一个不明确的设计。所以,保持它的整洁,不要试图聪明地节省一些位或不必制作新表;)
对此表的更改总是同时影响两个元素,而不仅仅影响一个元素。如果你想在评论中添加一个缩略图链接,你也必须触摸帖子。这导致更多的测试,一切仍然有效。
表中有空值是可以的,但并不理想。当您在必须检查空值的编程环境中尝试使用此表时,这当然很烦人
如果它们继承自同一类型,则可以将它们放在一个表中。例如,您可以有一个“text”元素,让我们假设一个评论和一篇文章是一个文本。但是,第1点的关系仍然存在,这将再次导致丑陋的设计。
收视率系统:你只需要制作一个普通的收视率表,评论和帖子表就会与收视率表建立一个fk关系。就像你现在为用户准备的一样。但是,您也可以创建两个单独的表,以便以后更加灵活,并且它可以使连接更快一些,因为评级表不会变得那么大。但这更像是个人喜好。如果评级系统会相互偏离,我当然会制作一个单独的表格,但在这种情况下,我也会选择一个。

相关问题