【问题标题】:database schema for document revision文档修订的数据库模式
【发布时间】:2014-01-10 16:11:59
【问题描述】:

我有一个正在尝试规范化的架构:

Component
( component_id
, component_number
, component_revision
, ...
)

Component_lot
( component_lot_id
, component_lot_number
, component_number
, component_revision
, ...
)

Component_supplier
( component_supplier_id
, component_supplier_name
, component_number
)

理想情况下,我想去掉component_lot 和component_supplier 表中的component_number,以及component_lot 表中的component_revision,只使用component_id。

问题是当组件修订版发生变化时,我在组件表中有多个相同组件号的条目,我必须找到一个好的方法来确定哪个修订版是活动的(不是简单的1、2 , 3 个我可以排序的编号系统,并且可能存在新修订但尚未激活)。此外,如果我创建一个组件的新修订版,它会获得一个新 id,现在我必须在 component_supplier 中为该组件的新修订版建立供应商。

我考虑过在组件中创建一个 isActive 字段,但这似乎不是解决问题的有效方法。我还考虑过将 component_number 保留为 component_supplier 中的 fk,但在某些情况下组件编号可能会更改(很少见,但可能)。

任何建议或文章链接将不胜感激。

【问题讨论】:

    标签: sql database-design database-schema


    【解决方案1】:

    标准化

    从您的故事中,我了解到 component_number 是它自己的实体,所以:

    Table Component_Numbers
    ( component_number_id /* PK */
    , component_number
    )
    
    /* UK: component_number */
    
    Table Components
    ( component_id /* PK */
    , component_number_id /* FK to Component_Number */
    , component_revision /* Descriptive. */
    )
    /* UK: component_number_id + component_revision */
    
    Table Component_Lots
    ( component_lot_id /* PK */
    , component_id /* FK to components. */
    , component_lot_number /* Descriptive. */
    )
    /* UK: component_lot_number */
    
    Table Component_Suppliers
    ( component_supplier_id /* PK */
    , component_supplier_name /* Descriptive. */
    , component_number_id /* FK to component_numbers. */
    )
    /* UK: component_supplier_name + component_number_id */
    

    建议:为了保持列名简洁明了,我推荐id而不是component_supplier_id等。引用时,在目标表的别名前加上前缀,比如component_number_id变成cnr_idcnr作为component_numbers 的别名。

    有效修订

    有多种方法。最常见的:active_flag。需要业务规则来验证每个 component_number_id 只有一个有效。这可以在客户端、使用唯一键约束的数据库端(取决于数据库平台、SQL Server 和 Oracle 对于空值和唯一键的语义不同)或使用触发器的数据库端来完成。

    替代实现是维护表 components_active。当该表中出现 component_id 时,它处于活动状态。 UK 最多保证一个 component_number_id。根据您的平台,您需要将 component_number_id 复制到该表中,这会引入额外的代码来维护它。

    【讨论】:

    • 嗨@user1930587 这有助于解决您的问题吗?如果不是,请在您的问题中添加不成功的内容。当答案对您有帮助时,您是否可以通过单击旁边的空心绿色复选标记来接受它?
    猜你喜欢
    • 2011-06-29
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    相关资源
    最近更新 更多