在数据库原型中,我有一组字段(如名称,描述,状态),这些字段在多个功能不同的表中是必需的.
这些字段始终具有相同的最终用户功能,用于标记,显示,搜索,过滤等.它们不是外键约束的一部分.该如何建模?
我可以想到以下变种:
每个表都获得所有这些属性.在这种情况下,你会如何命名他们?相同,在每个表中,或与表名前缀(如usrName,prodName)
将它们移动到表属性中,将外键添加到"核心"表,引用Attributes.PK
如上所述,但不是外键,而是在各自的核心表中使用Attributes.PK作为PK.
Owen.. 8
听起来你可能会把规范化的想法推得太过分了.记住,这是你减少数据冗余的想法.您的示例似乎表明您担心数据库设计的元信息中的"冗余".
最终虽然,user.name
和user.description
是从功能的不同product.name
和product.description
,并且应被视为这样.因为status
,这取决于你的意思.是status
不仅仅是一个产品/用户的记录的指标是主动或不?如果是这样,那么将它分成不同的表是有意义的.
使用您提供的信息,如果"活动/过期/删除"仅仅是数据库中状态的指示,那么我肯定会同意这样的表结构:
users products status id id id name name name description description status_id status_id
然而,如果status
可以想象地改变以表示语义上不同的东西(即,对于用户,可能是"活跃/退休/解雇"),我建议将其拆分为未来的设计证据:
user_status product_status id id name name
简而言之,规范化您的数据,而不是数据库设计.
听起来你可能会把规范化的想法推得太过分了.记住,这是你减少数据冗余的想法.您的示例似乎表明您担心数据库设计的元信息中的"冗余".
最终虽然,user.name
和user.description
是从功能的不同product.name
和product.description
,并且应被视为这样.因为status
,这取决于你的意思.是status
不仅仅是一个产品/用户的记录的指标是主动或不?如果是这样,那么将它分成不同的表是有意义的.
使用您提供的信息,如果"活动/过期/删除"仅仅是数据库中状态的指示,那么我肯定会同意这样的表结构:
users products status id id id name name name description description status_id status_id
然而,如果status
可以想象地改变以表示语义上不同的东西(即,对于用户,可能是"活跃/退休/解雇"),我建议将其拆分为未来的设计证据:
user_status product_status id id name name
简而言之,规范化您的数据,而不是数据库设计.