在数据库中建模显式1到2关系

时间:2014-08-01 02:07:44

标签: database-design data-modeling

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

1 个答案:

答案 0 :(得分:1)

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

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

除此之外,将实体作为字段使您的应用程序开发人员的生活可能更加困难。为了找到一对配对的主题数,该开发者必须每次都检查这两个字段的数量。使用简单的SELECT ... JOIN语句要简单得多,并且价格也不会那么贵,特别是如果您正确地索引了列。

我会建议两个表,一个用于Subject,一个用于Pair。您可以使用简单的函数强制执行2个主题最大值并检查约束,如下所示:

/* 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);