2011-10-11 94 views
0

我需要一个表来存储工作项目。工作项目可以与我们的数据库中的许多不同类型的现有实体中的一个相关联,如人员,公司等。一种方式是将实体类型和实体ID存储在两列中以供参考。这是我以前做过的事情。另一种方法是为每种类型的实体设置多个列。
在第一种方法中,应用程序必须维护关联中的完整性约束。数据库专家对第二种方法有偏好,因为它可以具有FK约束,并且如果需要,还可以针对不同的实体ID使用不同的数据类型。很显然,除了一列以外的每一行都会有一个空值。根据数据库专家修改表格以添加新的参考不是问题,因此有很多空值。具有多个参考列的数据库设计或具有参考类型和ID的两列

在这一点上,我对这种方法没有大的反对意见,但我仍然想问一下。 我的问题是,是否有充分的理由不应该使用第二种方法。

+0

人,公司和WorkItem之间的现实世界关系是什么?人,是在这个项目上工作的人吗?是该项目分配给谁的人?发起该项目的人是谁?与公司类似。人员和公司都可以与同一个WorkItem关联吗? – Thomas

+0

没有,人与公司之间没有关系。我们处理这两件事情,并希望为员工创建一个工作项目来完成一些工作。例如WI可能会更改该人的地址,另一个WI可能会退还给公司等。一个人和公司不能有相同的WI,WI只能有一个参考。我们还将为WI分配用于专职工作人员的用户列。 – softveda

+0

@Pratik,你的问题有11个句子。只有前两句描述了这个问题;其余的是你的意见, 你以前做过的事情,你的数据库专家的意见等。 我们是否真的应该只从这两句话中理解问题(你试图建模的东西)? –

回答

0

如果2个值不为空,该怎么办?

如果零值不为空,该怎么办?

您需要添加业务逻辑以正确执行约束。

其他列的唯一好处是FK定义的默认数据库级别约束。 缺点与所有非规范化的缺点相同。

我会避免不得不为新数据条件更改模式,使用选项1,在触发器中创建适当的业务逻辑以强制实施约束。

我的2美分

也:

认为这是一个工作项目可能在某一时刻要与同类型的其他实体(如人)的多个关联。

您忽略了另一个选项,即创建一个将work_item链接到人员(或多个 - 可能包含角色和状态等)的新关联表格,以及另一个用于work_item的关联表格,你可以在这个中间表上强制执行FK约束,并且对你的业务逻辑也有一个好的地方。

+0

可以通过检查约束来强制执行两个或更多值不为空。零值不为空是允许的,因为WI可以在没有参考的情况下被创建并且稍后被修改以添加参考。 – softveda