1

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

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,但在某些情况下组件编号可能会更改(很少见,但可能)。

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

4

1 回答 1

0

规范化

从您的故事中,我了解到 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_idetc。在引用时,在其前面加上目标表的别名,就像component_number_id变成cnr_idwith cnras alias for一样component_numbers

主动修订

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

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

于 2014-01-10T08:11:59.297 回答