数据库设计模式:跨表的多对多关系?

时间:2010-09-15 02:50:34

标签: sql sql-server sql-server-2008 database-design relational-database

我有以下表格:

部分内容

我想和他们联系。


我目前的方法是下表:

relation table

我会存储

  • 部分部分
  • 部分指向内容
  • 内容部分
  • 内容内容


现在,虽然我明显可以通过添加一对字段来指明源是分段还是内容,以及目标是部分还是内容 ,我想知道是否有更清洁的方法来做到这一点。如果可能的话,只使用一张表来表示关系,这在我看来是最干净的。我还希望该表能够以某种方式与 Section Content 表相关联,这样我就可以避免手动添加约束,或者在时删除关系的触发器部分内容已删除...

像往常一样感谢输入! < 3

2 个答案:

答案 0 :(得分:2)

以下是我的设计方法:

CREATE TABLE Pairables (
  PairableID INT IDENTITY PRIMARY KEY,
  ...other columns common to both Section and Content...
);

CREATE TABLE Sections (
  SectionID INT PRIMARY KEY,
  ...other columns specific to sections...
  FOREIGN KEY (SectionID) REFERENCES Pairables(PairableID)
);

CREATE TABLE Contents (
  ContentID INT PRIMARY KEY,
  ...other columns specific to contents...
  FOREIGN KEY (ContentID) REFERENCES Pairables(PairableID)
);

CREATE TABLE Pairs (
  PairID     INT NOT NULL,
  PairableId INT NOT NULL,
  IsSource   BIT NOT NULL,
  PRIMARY KEY (PairID, PairableID),
  FOREIGN KEY (PairableID) REFERENCES Pairables(PairableID)
);

您可以在Pairs中为每对插入两行

现在可以轻松搜索任何类型的可配对实体,您可以在同一列中搜索源或目标,并且您仍然只需要一个多对多交叉表。

答案 1 :(得分:1)

是的,有一种更清洁的方法:

  • 一个表跟踪从一个部分到另一个部分的关系,并将它们强制为外键约束
  • 一个表跟踪从Section到Content的关系,并将它们强制为外键约束
  • 一个表跟踪从Content到Section的关系,并将它们强制为外键约束
  • 一个表跟踪从内容到内容的关系,并将它们强制为外键约束

这比具有重载ID的单个表更加清晰 更清晰,无法通过外键约束强制执行。数据建模和域建模模式从未提及类似于您描述的模式的事实应该是您的第一个警钟。第二个警报应该是引擎无法强制执行您想象的约束,并且您必须停留在触发器中。

在一个表中建立四个不同的关系不会给模型带来任何优雅,它只会增加混淆。关系模型不是C ++:它没有继承,没有多态,没有重载。试图在数据建模中强制执行OO思维导致许多优秀的开发人员陷入了无法维护的磁盘表状位触发网格中,模糊地类似于“数据”。