我有一个设计任务,我想在其中存储一个实体和许多其他实体之间的关系。一个给定的实体 X 可以连接到一个或多个实体 Y。所有实体都存储在同一个表中。我正在寻找在 MS SQL 数据库中表示这种关系的正确方式(在数据规范化方面)。
我刚刚谈到了充当 2 个独立实体之间的参考点的“联结表”(通过强制执行键约束),但是我的大脑无法看到如何在所有实体都存储在同一个表中的问题上重用这种技术.
问候, 谢尔盖
这是您要实现的目标的示例架构。这是针对 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)
);
为方便起见:这是适用于 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 引擎会抛出异常。