我是否正确地规范了这些数据

时间:2018-05-24 15:33:14

标签: database database-normalization

我正在从网上完成规范化练习,以测试我的数据规范化能力。这个特殊问题发现于:https://cs.senecac.on.ca/~dbs201/pages/Normalization_Practice.htm(练习1)

此问题所基于的表如下: Table

可以从此表创建的非标准化表是:

enter image description here

要遵守First Normal表单,我必须通过将visitdate,procedure_no和procedure_name移动到各自的表中来删除表中的重复字段:

enter image description here

这也符合2NF和3NF,这使我怀疑我是否正确执行了标准化过程。如果我没有从UNF正确地搬到1NF,请提供反馈。

2 个答案:

答案 0 :(得分:4)

在第一步中,您可以创建以下表格(假设pet_id在表格中是唯一的):

Pets:   pet_id, pet_name, pet_type, pet_age, owner
Visits: pet_id, visit_date, procedure

更进一步,您可以拆分procedure,因为描述重复:

Pets:       pet_id, pet_name, pet_type, pet_age, owner
Visits:     pet_id, visit_date, procedure_id
Procedures: procedure_id, description

虽然相同的procedures在同一个visit_date上可以有多个pet_id,但我认为没有理由进一步拆分:日期可以(理论上)存储在2中字节,并拆分该数据会产生更多的开销(加上额外的索引)。

您还希望将pet_age更改为pet_birth_date,因为年龄会随着时间的推移而变化。

由于这是您列表中的第一个练习,因此上述内容可能已经足够了。

更进一步:

owner可以有多个宠物,因此可以创建另一个表:

Pet_owners: owner_id, owner_name

然后仅在owner_id表中使用Pets。在一个真实的系统中,会有customer_id, name, address, phone, email等 - 所以应该总是在一个单独的表中。

您甚至可以对pet_type执行相同操作,并将id存储为1或2个字节,但这一切都取决于您稍后要对数据执行的查询类型。

答案 1 :(得分:2)

提出的问题很少。看看最后两列。提问者并不意味着每个列的类型都是集合。它们意味着同一行上的值对构成了一个集合的元素。他们应该有一个列的值为三元组 - 日期,数字和&名称。这就是他们只使用一列(最后一列)进行数字和放大时所做的事情。名称。请注意,他们在您链接到的页面链接到的pdf中的解决方案有一个表格,其中包含日期,数字和数据的全部三个。名。

但你怎么认为知道这些值应该配对?毕竟,如果日期列给出了宠物访问日期和时间的集合。程序栏给出了一套程序编号&如果有一个宠物的名字,那么我们就不会将一对值作为集合的元素放在同一行上。不幸的是,你只是应该神奇地猜测。 (提示是宠物的日期和数字对的数量始终相同。)

以上图示中的空白区域为集值属性的垂直显示腾出空间;描绘的表有4行。但也许他们在那里因为你应该通过将空白子行解释为代表最近的非空白子行来从这个插图中获得关系。然后该表将没有任何设定值列;描绘的表有9行。碰巧这种解释不同意与链接答案的UNF& 1NF部分。

如果他们不打算解释桌子和&只是依靠你的猜测,如果他们把访问的程序日期,数字和数字放在一起会更清楚。一列下的名字 - 就像他们提供一个程序号和&名称在一列中。但实际上,他们应该总是告诉你如何阅读插图。但实际上,总是询问如何阅读插图。如果有相关课程/教科书的任何解释惯例,那么你应该把它放在你的问题中让我们知道。

不幸的是,“UNF”表几乎总是同样很差,没有任何关于如何解释它们的描述。 Also "1NF" has no standard meaning & there is no standard notion of "normalizing to 1NF".