我的帖子表包含以下列:id,user_id,title,message,date
我的评论表包含以下列:id,user_id,post_id,message,date
由于这两个表非常相似,所以最好只有一个包含列的表:
id,user_id,parent_id,type,title,message,date
并且作为父帖子的每一行都将具有空的parent_id值,并且作为子帖子的每一行都将具有空标题值。 父类帖子的类型为1,子帖子的类型为2。
编辑:我还将使用评级功能,我再次提出相同的问题,2个具体的post_rating和comment_rating表,或通用的评级表。在评级表的情况下,结构将完全相同,因此没有可空字段。评级表也不太可能发生变化,因为它只知道评级的所有者,实际评级以及目标帖子/评论/等。
答案 0 :(得分:6)
我不会这样做有几个原因:
评估评级系统:您只需制作一个包含评级的普通表格,评论和帖子表格将与评级表格建立FK关系。就像你现在为用户所拥有的一样。但是,您也可以制作两个单独的表,以后更灵活,并且它可以使连接更快一些,因为评级表不会变得那么大。但这比其他任何事情更具个人偏好。如果评级系统会相互偏离,我肯定会单独制作一个表,但在这种情况下我也会选择一个。
答案 1 :(得分:1)
使用单个表可以让您拥有更深层次的嵌套层次结构。例如:
title
comment
comment2
comment_to_comment
comment3
comment_to_comment2
comment_to_comment3
所以它是2表设置不存在的附加功能。
"我只会在你需要这种能力时才这样做。因为查询会更复杂。向这样的表添加(root_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);
这种事情并不重要,你也可以设置触发器以防止循环关系。