代码之家  ›  专栏  ›  技术社区  ›  bevacqua

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

  •  1
  • bevacqua  · 技术社区  · 16 年前

    剖面图 内容

    我想把它们联系起来。


    我目前的做法如下表所示:

    relation table

    我会储存在里面

    • 剖面图 剖面图
    • 剖面图 内容
    • 内容 到 剖面图
    • 内容 到 内容


    部分 或者 内容 剖面图 内容 或 内容 已删除。。。

    2 回复  |  直到 16 年前
        1
  •  2
  •   Bill Karwin    16 年前

    下面是我的设计方法:

    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

        2
  •  1
  •   Remus Rusanu    16 年前

    是的,有一种更干净的方法:

    • 一个表跟踪节与节之间的关系,并将它们作为外键约束强制执行
    • 一个表跟踪从节到内容的关系,并将它们作为外键约束强制执行
    • 一个表跟踪从内容到内容的关系,并将它们作为外键约束来强制执行

    这是 许多的 比具有外键约束无法强制执行的重载ID的单个表更干净。事实上,无论是数据建模还是领域建模模式,从来没有提到过像您描述的模式,这应该是您的第一个警钟。第二个警报应该是引擎不能执行您所设想的约束,您必须停留在触发器中。

    在一个表中建模四个不同的关系不会给模型带来优雅,只会增加混淆。关系模型不是C++:它没有继承,没有多态性,没有过载。试图在数据建模中引入面向对象的思想,这让许多优秀的开发人员陷入了一个无法维护的、类似于“数据”的磁盘表触发器网格的泥潭。

    推荐文章