【问题标题】:Maintaining referential integrity保持参照完整性
【发布时间】:2010-09-26 10:40:49
【问题描述】:

给定架构:

MACHINE_TYPE { machine_type } 机器{机器,机器类型} 排序计划{排序计划,机器类型} SCHEDULE { day_of_week, machine, sort_plan }

以及业务规则:

排序计划可以分配给任何 machine_type 相同的机器。

我如何强制在 SCHEDULE 中,machinesort_plan 引用的元组具有相同的 machine_type

如有必要,可以更改架构。

【问题讨论】:

    标签: ddl referential-integrity


    【解决方案1】:

    我会在 SCHEDULE 表上使用插入触发器。

    【讨论】:

    • 这是我的第一个想法,但我觉得我错过了一些明显的东西。
    • 只要确保触发器可以处理多个记录插入。
    • 触发器很可怕。除非绝对必要,否则我会尽量避免它们。然而,有些人确实觉得你永远也吃不饱。
    【解决方案2】:

    您可以更改计划表,使其没有 MachineType,并添加一个名为 machinePlan 的新表,其中包含可以使用该计划的每台机器的一行,带有 MachineId 和 PlanId。然后从这个新表的父机器表而不是从计划表本身为计划派生 MachineType。

    最后,更改计划表,使其 FK 回到这个新的 MachinePlan 表,而不是您当前拥有的表

    MACHINE_TYPE { machine_type }
    MACHINE { machine, machine_type }
    SORT_PLAN { sort_plan}
    MACHINE_SORTPLAN {machine, sort_plan }
    SCHEDULE { day_of_week, machine_Sortplan }
    

    这还带来了额外的好处,因为您不会不可撤销地为它们适用于哪种机器类型的计划键入规则。您单独保留此关联,如有必要,可以决定使用相同的规则集(相同的计划,用于不止一种机器类型的机器......

    【讨论】:

    • 这可能是我正在寻找的。创建排序计划时,未指定机器,仅指定机器类型。
    • 那么您需要将机器类型重新添加到 sortPlan 中,但是在将计划分配给新机器或创建计划时,仍然需要将记录添加到 MachineSortPlan 表中(如以及安排)将强制执行您的约束
    • "...要求必须将记录添加到 MachineSortPlan..." 本质上不需要触发器吗?我将如何仅使用 RI 来执行此操作?
    • 我会用这个作为答案。讨论使我确信触发可能是要走的路。
    • 使用我概述的模式需要记录存在(或添加)到 MachineSortPlan .. 在插入 machineSortPlan 记录之前,您不能将带有 FK 的新计划添加到 Machine_SortPlan FK 参考...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-30
    • 2013-06-17
    • 2010-12-29
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多