Sql 文档修订的数据库模式

Sql 文档修订的数据库模式,sql,database-design,database-schema,Sql,Database Design,Database Schema,我有一个我正在尝试规范化的模式: 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

我有一个我正在尝试规范化的模式:

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_编号,以及component_lot表中的component_修订,只使用component_id

问题是,当组件修订发生更改时,我在组件表中有多个条目用于相同的组件编号,我必须找到一种好方法来确定哪个修订处于活动状态。我不能按简单的1、2、3编号系统进行排序,而且可能存在一个新修订,但尚未处于活动状态。此外,如果我创建了一个新的组件版本,它将获得一个新id,现在我必须在component_supplier中为该组件的新版本建立供应商

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

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

规范化 从您的故事中,我了解到组件_编号是其自身的一个实体,因此:

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\u supplier\u id等。引用时,使用目标表的别名作为前缀,例如component\u number\u id变为cnr\u id,cnr作为component\u编号的别名

主动修订 有多种方法。最常见的:活动_标志。要求业务规则验证每个组件\u编号\u id只能有一个有效。这可以在客户端完成,使用唯一密钥约束的数据库端取决于数据库平台,SQL Server和Oracle对空值和使用触发器的唯一密钥或数据库端具有不同的语义


另一种实现是保持表组件处于活动状态。当组件id出现在该表中时,它处于活动状态。UK确保最多有一个组件编号。根据您的平台,您需要将组件编号复制到该表中,该表引入了额外的代码来维护它。

hi@user1930587这有助于解决您的问题吗?如果没有,请在您的问题中添加不成功的内容。当答案对您有帮助时,您能否通过单击旁边的空心绿色复选标记来接受它?