2010-08-31 158 views
2

一张图片更加公正,所以我将从此开始。 Dependent Relation数据库模型依赖关系

所以在我的Relation_Type表中,我有几种不同的类型(Owner,Reviewer,Approver等)。
在我Relation_Status表我有不同的状态对于一些类型:

Reviwer:(待定反馈,收到的反馈)
审批:(作出决定之前,已批准,被拒绝)

我的问题是,如果关系类型是反馈,我不知道如何强制执行的关系,这种关系将状态限制为仅反馈状态'
现在,这是建模的一种关系类型的反馈可以有任何状态是逻辑不一致。另外,并非所有类型都具有状态。

因此,有关如何对其进行建模以便强制执行依赖关系的任何提示?

谢谢,劳尔

回答

0

也许你需要一个组合Status_IdType_Id的复合外键。

+0

这个伎俩。我必须使用_id和type_id列在状态表上添加一个唯一约束,这样我才能创建复合外键。我选择这个答案的原因是因为其余的要么直接与状态联系在一起,要么有一个附加的逻辑分组表。这些选项不起作用,因为并非所有类型都具有状态。 谢谢 – HaxElit 2010-09-01 13:53:18

1

,您可以创建另一个表TypeStatus(ID, Type_Id, Status_Id)。它将FK指向_Type和_Status表,并且_Relation表对这个新表有一个FK,而不是对现有表的两个FK。然后,你会从_Status表中删除_Type_Id列,我想。

+0

虽然存储允许的类型和状态组合的新表是一个好主意,但用新的表将单个FK替换到_Relation表上的现有两个FK可能不是一个好主意 - 如果现有的类型 - 状态组合不再有效,新表上的记录需要被删除,但是这会在_Relation表上留下孤立记录。 – 2010-08-31 17:54:13

+0

我认为这将是一个问题,无论你是否有一个FK或两个......在这两种情况下,如果删除了有效的类型 - 状态组合,_Relation表中可能有需要更新或删除的记录匹配功能约束。 – joelt 2010-08-31 18:52:44

+0

我认为这个解决方案只适用于类型和状态之间存在多对多关系的情况。虽然在问题中没有明确说明,但该图表明状态和类型之间存在一对多的关系。因此,如果存在一对多关系,则您必须在此解决方案中添加其他约束条件。如果这种关系是多对多的,那么我们可以为我们的最佳答案投票。这是多对多关系的正确解决方案。 – bobs 2010-08-31 23:20:21

0

我将删除Project_Resource_Relation表中的Project_Resource_Relation_Type_Id列。这将删除从Project_Resource_RelationProject_Resource_Relation_Type.的关系

关系类型已通过Project_Resource_Relation_Status表与Project_Resource_Relation表相关。 Project_Resource_Relation_Status表已强制执行类型和状态之间的关系。

+0

这不起作用,因为并非所有类型都有状态。所以如果我没有地位,我不能回到这种类型。 – HaxElit 2010-09-01 13:54:43