在SQL Server中设计邻接列表或父子关系?

问题描述:

我正在尝试维护孩子的报价编号和他们的父母报价编号。我想用他们的父母引号ID存储两个子引用,因此我将能够查询哪些引用是在父子关系中。在SQL Server中设计邻接列表或父子关系?

我对设计感到困惑,应该先将parent_id保留为NULL,意思是如果孩子本身就是父母,就像员工是经理一样,或者保留父母引用ID与孩子引用ID相同。

我做了两个设计与NULL和与父报价id相同的孩子报价编号。

这将使我的设计更简单,查询更容易。

create table quotelist 
(
    pk_aquotelistid int primary key identity(1,1), 
    quoteid int, 
    parent_quoteid int 
); 

insert into quotelist values(1,1), (2,1),(3,1); 
insert into quotelist values(4,4), (5,4); 
insert into quotelist values(6,6), (7,4); 

http://sqlfiddle.com/#!3/c4ad9/1

OR

create table quotelist 
(
    pk_aquotelistid int primary key identity(1,1), 
    quoteid int, 
    parent_quoteid int 
); 

insert into quotelist values(1,NULL), (2,1),(3,1); 
insert into quotelist values(4,NULL), (5,4); 
insert into quotelist values(6,NULL), (7,4); 

http://sqlfiddle.com/#!3/0ba5f/1

我觉得在parent_quoteid使用NULL是更自然的方式,没有人记得在每个查询添加quoteid != parent_quoteid,排除记录没有parent_quote_id的地方。

而且,一旦parent_quoteid为NULL,这样的记录就不需要插入表中。这些记录可以通过LEFT JOIN的报价表获得,其中quotelist.parent_quoteid IS NULL。 HTH。

如果你选择做父母的报价已经parent_quoateid = null,则你的WHERE子句中找到父母的报价是(按照您的特定SQL方言):

WHERE parent_quoteid = NULL 

而对于孩子报价是:

WHERE parent_quoteid <> NULL 

如果您选择将parent_quoteid设置为父母的引用ID,那么您的where子句看起来相当相似; WHERE quoteid = parent_quoteidWHERE quoteid <> parent_quoteid

多对多关系的标准是,如果一个项目不在关系中,它不应该有一个行(考虑将“quoteid”重命名为“child_quoteid”,并查看它是否它仍然有意义的行)。各种关系类型(一对一,一对多,多对多)是我所知道的关于数据库的唯一设计模式,更不用说指示简单的模式。

但是,您没有问是否该行应该存在或不存在。你问parent_quoteid是否应该为null。那么让我们来看看查询性能和查询的难易程度。

如果这个特定的选择会影响性能或者查询表格有多容易,那么您会希望使用NULL来指示父引号;用于确定父母与孩子的查询将涉及更少的字段和索引。

如果您需要将此表加入引号表中,我会指出,对于父引号不使用NULL可能会导致数据库必须使用3个字段而不是2个字段的情况为了执行加入。如果您不使用NULL,那么您可以在quoteid字段中拖动,否则只需使用parent_quoteid和您要加入的表中的字段。