数据库设计规范化需要帮助(5NF)

8
请问能否告诉我如何将这个ERD转换为第五范式呢?我们昨天完成了一个课堂作业,客户真的来了并向我们解释了他的需求,我的小组提出了这个模型,我试图将其进一步扩展以便更好地理解它,因为下周我们将做另一个小组ERD,必须符合第五范式,问题是我不知道从哪里开始,书也没能帮助我。你们能帮我吗?请看ERD模型 http://img534.imageshack.us/img534/2118/capturekk.jpg
新信息:“虚假客户需求”
客户有两个部门“实验室1、实验室2”,从他那里订购医疗物品,如手套和培养皿等。这些部门已经扩大,他希望跟踪库存中有什么、供应商在销售什么、谁的价格最优以及成本中心从哪里来的。
据他所说,订单的方式是个人去找他要货品,然后他记录下该人员的实验室名称、姓名和账单成本中心。但他还想追踪按日期购买的物品,库存中有什么和需要购买什么。他还举例说明,有些用户想要从某个特定的供应商那里获得物品,这可能不是最优价格,他也会收到一些带价格的目录杂志,他想要跟踪这些信息。如果我描述得有点混乱,请见谅,这都是我凭记忆写的。

有什么让你觉得这不是已经在第五范式中了吗? - user359040
在维基百科上学习这些形式的定义让我怀疑这是真的,尽管我会关注讨论。 - Brian Hooper
请澄清此模型背后的业务逻辑:它是一个采购跟踪系统,客户可以查看他们与各个供应商下达的订单,而不是通常情况下供应商跟踪客户下达的订单。 - APC
让我把“假”的客户需求添加进去,因为他在课堂上经历过。我说“假”,因为他是教授的丈夫。 - Michael Quiles
这个人根据他告诉我们的情况为两个实验室订购了物资,所以有点混合。它可以进一步扩展,但是这个模型是在一个半小时的课堂时间内完成的,教授说它很好,所以这正是我们提交的内容。这个模型是在我们复习5NF材料之前完成的,这就是我的问题所在。 - Michael Quiles
2个回答

4
我冒昧说一句,你目前的架构实际上没有符合第五范式的任何资格。引用维基百科上的一句话,它说大多数的四范式表已经符合了第五范式: 仅在罕见的情况下,4NF表才不符合5NF。这些情况是指4NF表中控制属性值有效组合的复杂实际约束并未隐含在该表的结构中。如果这样的表没有规范化为5NF,则在插入、删除和更新其数据时维护逻辑一致性的负担必须由应用程序部分承担;并且表内数据变得不一致的风险会增加。相比之下,第五范式设计排除了这种不一致性的可能性。

http://en.wikipedia.org/wiki/Fifth_normal_form

也许目的不是使你的数据库达到5NF,而是理解它与5NF的结构之间的关系,并且为什么它可能已经符合5NF而进行论证。
更新:从评论中读取某种共识,似乎您的设计可能已经符合5NF,无论是通过设计还是通过以前规范化步骤的意外达成。

但是我真正想知道的是它能否进一步改进,当我们制作这张图表时,我领导了这个小组,主要是我的输入构成了ERD,但这主要是偶然和参考我们之前在课堂上审查过的幻灯片。 - Michael Quiles
好的,我的主要问题是你会不会用不同的方法来做这件事?如果是这样,你会怎么做才能使它成为一个稳定的5NF设计。 - Michael Quiles
在编程方面翻译以下内容,从英文到中文。仅返回翻译后的文本:在我看来,看起来非常稳固-您已将相关数据(即具有其属性的实体)聚合到它们自己的表中,已将您的多对多拆分。我认为您需要更复杂的结果集来证明5NF。查看维基百科条目,那里显示的示例相当具体。我认为当前的设计很好-如果不是,则讲师可以指出任何不足之处。 - Adam Houldsworth

1
免责声明:在不了解您的业务逻辑的情况下,以下建议可能完全错误。
好的,我在您的数据库模式中看到了一些事情。
你的成本中心表看起来既是查找表又是关联表。假设有固定数量的成本中心,比如说5个,但是有1000个用户,那么这个表将会有5000条记录,所有记录都存储成本中心名称(这是假设成本中心分配不是每个用户都唯一的情况)。你可能想要将用户关联拆分到一个单独的表中,该表有自己的主键和外键,分别是costcenterId和userId。
你的库存表(我假设它存储了物品的现有库存量)只需要一个onhand quantities而无需描述。如果描述对于每个库存物品并不唯一,您可能需要将其拆分为自己的查找表,并在库存表中进行引用。
您正在供应商表中存储“lineQuantity”。这个列是用来干什么的?听起来像是某种方式与特定订单相关(购买商品的数量?),如果是这样,您将希望将其拆分为自己的表,并将其与订单关联,而不是与供应商关联。如果不知道“lineQuantity”究竟是什么,那么这个建议可能完全错误。
最后一个建议,不确定这是否对您的班级有影响。您定义所有数据类型都为CHAR(10),您可能希望将它们更改为实际用于数据库的数据类型。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接