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

Am I Properly Normalizing this Data

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

table这个问题的依据如下:

可以从这个table创建的非规范化table是:

为了符合第一范式,我必须通过将 visitdate、procedure_no 和 procedure_name 移动到它们各自的 [=30] 来摆脱 table 中的重复字段=]s:

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

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

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

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

您还想将 pet_age 更改为 pet_birth_date,因为年龄会随时间变化。

由于这是您列表中的第一个练习,以上内容可能绰绰有余。

更进一步:

一个owner可以有多个宠物,所以可以创建另一个table:

Pet_owners: owner_id, owner_name

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

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

问题提得不好。查看最后两列。提问者并不意味着每列的类型都是集合。它们意味着同一行上的成对值构成集合的一个元素。他们应该有一列的值是三元组——日期、号码和姓名。当他们只使用一列(最后一列)作为数字和姓名时,他们就是这么做的。请注意,您 link 访问的页面 link 提供的 pdf 中的解决方案有一个 table,其中包含日期、编号和名称这三者。

但是您应该如何知道这些值应该配对?毕竟,如果日期列给出了一组宠物的访问日期,程序列给出了一组程序编号和宠物曾经拥有的名称,那么我们 不会 应该采取与集合的元素位于同一行的一对值。不幸的是,你只是应该 神奇地猜对 。 (提示 宠物的日期和数字名称对的数量始终相同。)

上面将图中的空白区域留在那里,为设置值属性的垂直显示腾出空间;描绘的 table 有 4 行。但也许它们在那里是因为您应该通过将空白子行解释为表示最近的非空白子行来从此图中获得关系。那么 table 将没有任何设置值的列;描绘的 table 有 9 行。碰巧这种解释不同意 linked 答案的 UNF 和 1NF 部分。

如果他们不打算解释 table 并且只是依赖于您的猜测,那么如果他们将访问的程序日期、编号和姓名放在一栏下会更清楚——就像他们一样将程序编号和名称放在一列中。但实际上,他们应该总是告诉你如何阅读插图。但实际上, 应该总是问如何阅读插图。如果有相关course/textbook的任何解释约定,那么你应该把它放在你的问题中让我们知道。

不幸的是,"UNF" tables 几乎总是同样糟糕地给出,没有任何关于如何解释它们的描述。