MS SQL:如何设计一个表,其中行可以引用同一个表中的行

时间:2013-08-01 15:18:59

标签: sql database reference entity

我有一个设计任务,我想在其中存储一个实体和许多其他实体之间的关系。给定实体X可以连接到一个或多个实体Y.所有实体都存储在同一个表中。我正在寻找在MS SQL数据库中表示此关系的正确(在数据规范化术语中)方式。

我刚刚谈到了作为两个独立实体之间的参考点的“联结表”(通过强制执行关键约束),但是我的大脑无法看到我如何能够将这种技术重用于我的问题,其中所有实体都存储在同桌。

此致 谢尔盖

2 个答案:

答案 0 :(得分:1)

以下是您尝试实现的示例架构。这适用于mySQL,但它应该足以为您提供真实的想法。 每个“节点”(在您的情况下为实体)都是特定类型,节点之间的关系存储在NodeLinkNode表中。每个关联都是特定类型,如“LinkType”表中所定义。

CREATE TABLE NodeType
(
  Id INTEGER PRIMARY KEY, 
    Name TEXT NOT NULL
);

CREATE TABLE Node
(
  Id INTEGER PRIMARY KEY, 
    Title TEXT NOT NULL, 
    CONSTRAINT FK_Node_NodeType FOREIGN KEY (NodeTypeID) REFERENCES NodeType(Id)
);

CREATE TABLE LinkType
(
  Id INTEGER PRIMARY KEY, 
    Name TEXT NOT NULL
);

CREATE TABLE NodeLinkNode
(
  FirstNodeId INTEGER NOT NULL, 
    SecondNodeId INTEGER NOT NULL , 
    LinkTypeID INTEGER NOT NULL, 
    PRIMARY KEY (LinkTypeID, FirstNodeId, SecondNodeId), 
    CONSTRAINT FK_NodeLinkGroup_Node FOREIGN KEY (FirstNodeId) REFERENCES Node(Id), 
    CONSTRAINT FK_NodeLinkGroup_Group FOREIGN KEY (SecondNodeId) REFERENCES Node(Id), 
    CONSTRAINT FK_NodeLinkGroup_Type FOREIGN KEY (LinkTypeId) REFERENCES LinkType(Id)
);

答案 1 :(得分:0)

为方便起见:这是在MS SQL中运行的代码

CREATE TABLE Site (    
    ID int primary key,    
    Name varchar(30)    
)

CREATE TABLE SiteNeighbours (    
  ParentSiteID int references Site (ID),    
  ChildrenSiteID int references Site (ID),    
  constraint pk_SiteNeighbours primary key (ParentSiteID, ChildrenSiteID)
)

代码创建Site表和SiteNeighbours表。后者根据我上面的问题存储网站的关系。 肉是我们在桌子上的约束,因此表中的主键对必须是唯一的。这会限制重复数据并保持关系列表的完整性。

如果插入已存在的关系,则MSSQL引擎会抛出异常。