我有一个设计任务,我想在其中存储一个实体和许多其他实体之间的关系。给定实体X可以连接到一个或多个实体Y.所有实体都存储在同一个表中。我正在寻找在MS SQL数据库中表示此关系的正确(在数据规范化术语中)方式。
我刚刚谈到了作为两个独立实体之间的参考点的“联结表”(通过强制执行关键约束),但是我的大脑无法看到我如何能够将这种技术重用于我的问题,其中所有实体都存储在同桌。
此致 谢尔盖
答案 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引擎会抛出异常。