【问题标题】:Modeling explicit 1 to 2 relationship in database在数据库中建模显式 1 到 2 关系
【发布时间】:2014-08-01 13:27:27
【问题描述】:
如果我想建立 1 对 2 的关系,我很好奇,最好的建模方法是什么。 1 到 2 不可能改变。它将有一个属于一对的主题,所以有一个总是有主题1和主题2的对对象。在 pair 对象中有 subject1 和 subject2 的外键是不好的形式吗?我意识到一个连接表可以正常工作,但是一个主题可以属于超过 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);