0

我有一个关于规范化的问题,关于我的场景是什么级别的正常形式。我有几个表具有相同的字段 - 姓名地址 1、地址 2、邮政编码和电话号码;

Client [id, instructor id, name, address, postcode, phone, practical, theory]
Staff [id, office id, name, job, address, postcode, phone]
Registration id, name, address, postcode, phone]
Office [id, manager id, address, postcode,    phone]

是否存在任何正常的形式来将它们的字段分成类似这样的东西......

Client [id, instructor id, details_id, practical, theory]
Staff [id, office id, details_id, phone]
Registration [id, details_id]
Office [id, manager id, details_id]

Details [id, full_name, address1, address2, postcode, phone_no]

不确定标准化是否会像那样工作,但这只是一个想法......

4

2 回答 2

2

将具有相同含义的列放在多个表中与规范化无关。它与数据库设计的不同形式原则有关。Chris Date 将其称为正交设计原则,或 POOD。

据我所知,POOD 背后的形式逻辑还没有像普通形式那样深入研究或被广泛接受。这是观察,不是批评。

于 2013-01-10T15:39:34.380 回答
-1

我将讨论第 3 范式,因为它是最常被引用为归一化的合理水平,尽管大约有 10 种范式。本质上,第三个 NF 意味着表中没有任何内容,正常形式真正处理关系(表)而不是整个数据库,它依赖于除键之外的任何东西。我通常认为它是删除任何候选键,就好像你有一个候选键和实际键一样,那么属性在功能上依赖于键以外的东西。

就地址问题而言,具有潜在重要的实体(例如包含在另一个实体的表中的地址)意味着该地址变得可传递地依赖于(在您的情况下)客户端。这意味着地址只有在客户端存活时才能存活。

这当然不一定是坏事,如果你没有客户,这取决于你是否想要地址。

如果是这种情况,那么地址本身就失去了它作为实体的地位,并成为一个值对象。假设您有一个 Order 表,并且您想保存它的发送地址,那么将其保存在 Order 表中就可以了。如果您以这种方式考虑地址,一个关键的事情是它变得不可变,它永远不会改变,订单发送到的地址将始终相同,它永远不会改变,因为它已经发生并且是事实。

假设您需要存储客户的地址和工作地址,现在您最终会遇到需要在客户表中添加更多列的情况,这一切都结束了!这导致了出于完整性和整洁性的实际选择,因此您创建一个地址表,它可能是为了保留正常形式或可能只是为了整洁,这取决于您想对新创建的地址实体做什么。

将东西移出表只是为了使表更易于管理通常会导致一对一的关系,并且无论是在客户端表中还是在客户端表中,正常形式很可能是相同的。

出于正确的原因移动东西需要一些练习,但值得精通它。

于 2020-03-21T01:40:00.683 回答