【问题标题】:Modeling explicit 1 to 2 relationship in database在数据库中建模显式 1 到 2 关系
【发布时间】:2014-08-01 13:27:27
【问题描述】:

如果我想建立 1 对 2 的关系,我很好奇,最好的建模方法是什么。 1 到 2 不可能改变。它将有一个属于一对的主题,所以有一个总是有主题1和主题2的对对象。在 pair 对象中有 subject1subject2 的外键是不好的形式吗?我意识到一个连接表可以正常工作,但是一个主题可以属于超过 1 对,如果我已经有这个对对象,那么只抓住 subject1 然后需要搜索整个连接表会更容易吗?或者这只是糟糕的数据建模

【问题讨论】:

    标签: database-design data-modeling


    【解决方案1】:

    如果您知道一对将只有 1 到 2 个主题,并且您真的...非常确定这永远不会改变,那么您可以这样做。

    话虽如此,由于几个原因,这是一个糟糕的设计。通常,如果您有相同实体类型的字段(即 thing1、thing2 等),那么这些字段实际上应该被分解到另一个表中。将实体列为字段会强制更改数据库中的业务规则极其困难。如果将来出于某种原因需要添加或删除这些字段之一,这将变得更加困难。在您的情况下,这不是一个大问题,但您永远无法 100% 确定您未来的架构。

    最重要的是,将实体作为字段会使您的应用程序开发人员的生活可能更加困难。为了找到一对拥有的主题数量,该开发人员必须每次都检查这两个字段。拥有一个简单的SELECT...JOIN 语句要简单得多,而且成本也不高,尤其是在您正确索引列的情况下。

    我建议两张表,一张用于主题,一张用于配对。您可以通过一个简单的函数和检查约束来强制执行您的 2 Subject 最大值,如下所示:

    /* Returns the number of Subjects for a given Pair */
    CREATE FUNCTION ValidateSubjectCount(@pairID int)
    RETURNS int
    AS
    BEGIN
        RETURN (SELECT COUNT(*) FROM Subject WHERE pairID = @pairID);
    END;
    
    /* Assures the Pair table has no more than 2 Subjects */
    ALTER TABLE Subject
    ADD CONSTRAINT chk_SubjectCount
    CHECK (dbo.ValidateSubjectCount(pairID) <= 2);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多