【问题标题】:Database Model Dependent Relationship数据库模型依赖关系
【发布时间】:2010-09-01 07:14:24
【问题描述】:

图片更公平,所以我将从它开始。

所以在我的 Relation_Type 表中,我有几种不同的类型(所有者、审阅者、批准者等)。
在我的 Relation_Status 表中,对于某些类型,我有不同的状态:

审稿人:(待定反馈,已收到反馈)
批准人:(待决、已批准、已拒绝)

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

那么关于如何建模它以强制依赖的任何提示?

谢谢,劳尔

【问题讨论】:

    标签: sql-server database database-design


    【解决方案1】:

    您可以创建另一个表TypeStatus(ID, Type_Id, Status_Id)。它将具有 _Type 和 _Status 表的 FK,并且 _Relation 表将具有此新表的单个 FK,而不是现有表的两个 FK。我认为,您还可以从 _Status 表中删除 _Type_Id 列。

    【讨论】:

    • 虽然用一个新表来存储允许的类型和状态组合是个好主意,但用单个 FK 替换 _Relation 表上现有的两个 FK 到新表 - 如果现有的类型-状态组合不再有效,则需要删除新表上的记录,但这会在 _Relation 表上留下孤立记录。
    • 我认为无论你有一个还是两个FK都会有问题......在这两种情况下,如果你删除一个有效的类型-状态组合,_Relation表中可能有记录需要更新或删除以匹配功能约束。
    • 我认为这个解决方案只有在类型和状态之间存在多对多关系时才有效。虽然问题中没有明确说明,但该图暗示状态和类型之间存在一对多的关系。因此,如果存在一对多关系,则必须在此解决方案中添加额外的约束。如果关系是多对多的,我会投票选出最佳答案。这是多对多关系的正确解决方案。
    【解决方案2】:

    也许您需要一个将Status_IdType_Id 组合在一起的复合外键。

    【讨论】:

    • 这成功了。我必须在具有 _id 和 type_id 列的 Status 表上添加唯一约束,以便我可以创建复合外键。我选择这个答案的原因是因为其余的要么直接与状态相关联,要么有一个包含逻辑分组的额外表。这些选项不起作用,因为并非所有类型都有状态。谢谢
    【解决方案3】:

    我将从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 表已经强制了类型和状态之间的关系。

    【讨论】:

    • 这不起作用,因为并非所有类型都有状态。因此,如果我没有状态,我就无法与类型联系起来。
    猜你喜欢
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多