【问题标题】:1:1 Relationship, Is this a good idea?1:1 关系,这是个好主意吗?
【发布时间】:2020-03-16 13:17:40
【问题描述】:

我有一个具有 5 个 1:1 关系的数据库。我有一个名为 SoftwareVersion 的表。每个 SoftwareVersion 都有 5 个认证阶段。所有 5 个阶段的 PhaseStatus 名称都相同。我无法使用一个 PhaseStatus 表和 SoftwareVersion 表中的一个 Ph0Status、Ph1Status 等字段来强制执行参照完整性。所以我建立了5个连接表。现在我有 5 个 1:1 的关系。每个 SoftwareVersion 都有多个具有状态的阶段,但每个软件版本只有一个阶段 0 状态。这是合法 1:1 关系的一个很好的例子,还是有更好的方法来建立这种关系?

【问题讨论】:

    标签: database database-design relational-database ms-access-2013 database-management


    【解决方案1】:

    每个 SoftwareVersion 都有多个具有状态的阶段,但每个软件版本只有一个阶段 0 状态。

    我认为您的意思是每个 SoftwareVersion 都有许多阶段,并且每个阶段一次有一个或多个可能的状态。

    如果是这样,据我所知,您只需要两张桌子。您需要一个包含 {phase,status} 的所有允许组合的 PhaseStatus 表。使用对该表的 FK 引用作为约束,以确保任何给定阶段中的软件版本都具有有效状态。您可能还需要枚举阶段和状态域的表,以防它们具有其他有趣的属性,例如描述或时间限制。

    【讨论】:

    • 所以我唯一遇到的问题是,如果我需要添加一个新的阶段状态,而不是在阶段状态表中添加一条记录,那么我需要添加 5 条具有重复信息的记录。
    • 类似,但不是“重复”。新阶段有自己的一组需要定义的有效状态。这些行与所有其他行不同;它们不是重复的。也没什么大不了的,因为你多久会添加一个阶段,它可以有多少个状态?可能是几个 SQL 语句,你就完成了。但是,如果您愿意——如果您想要求两个阶段允许完全相同的状态集——您可以创建一个由 StatusGroupId 键入的 StatusGroup 表,并将其用作 FK Phases 表而不是单个 PhaseStatus 表。
    猜你喜欢
    • 2016-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-18
    • 2011-08-14
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    相关资源
    最近更新 更多