原子值/可分性达到 1NF

Atomic values / divisibility to reach 1NF

阅读规范化后,我不确定如何解释 1 NF 要求

根据维基百科,如果“每个属性的域仅包含原子不可分割值”,则某些东西是第一范式

我的问题是:
谁决定什么是不可分割的? 您可以将日期数据类型分为年、月、日、秒、纳秒。您也可以将地址划分为精确的纬度坐标。什么时候才能真正确定达到1NF?

这个 table 会被认为是 1NF 吗?

fullName fullAdresss
Joe Zowesson 87th Victoria Street London EC96 1MB, 14584
Mason Hamburg 47th Jeremy Street London EC26 1MB, 13584
Dedrik Terry 27th Burger Street London EC16 1MB, 17584

我在这里的解释是,值 Joe Zowesson 对于列 fullName 是不可分割的。并且邮政编码、街道号码和街道名称相对于列名称 fullAddress 都是 atomic

我几乎可以肯定我错了,但我还不明白为什么。

问题是关于即将到来的考试,我将需要“证明”某些东西当前处于哪种正常形式。我发现这很难取决于你如何解释原子这个词。

你基本上误解了1NF的概念。原子值意味着当您有一个 Name 的列时,您不应该在它旁边存储任何其他值。换句话说,用于 Name 的列不应存储 IDAddress 或任何其他内容使用 Name,这样当您查询列 Name 时,您只会得到 Name,而不是使用 IdAddress 的名称。并且 姓名 可以是您想要的任何形式,无论是 名字 + 姓氏 还是 名字 + 姓氏 + 中间名姓名 + 曾用名.

是否需要为相关数据单独列的决定应在设计期间做出。假设您有 table Student:

StudentId FullName Address Average grade
1 John Done New York, US 3.4
2 Robert Bored New York, US 0
3 Student LName Dallas, US 1
4 Another LName Munich, Germany 2

在这种情况下,这意味着您不编写查询,也不需要分别基于 名字、姓氏 的数据,但是您需要一次全部,例如:

SELECT FullName
FROM Student
WHERE StudentId = 1;

John Done

而当你需要单独First name, Last name时,你将它们分解成几列,例如:

StudentId FullName LastName Address Average grade
1 John Done New York, US 3.4
2 Robert Bored New York, US 0
3 Student LName Dallas, US 1
4 Another LName Munich, Germany 2

您的查询可能如下所示:

SELECT LastName, AverageGrade
FROM Student
WHERE AverageGrade >= 1 AND FirstName != 'John';

结果将是:

| LastName | AverageGrade |
---------------------------
| LName    |     1        |
| LName    |     2        |

或者可能是这样的:

UPDATE Student
SET AverageGrade = 4
WHERE LastName = 'LName' AND FirstName != 'Student'

基本上,决定取决于您如何操作数据以及您需要以何种形式处理数据。

总结一下。关系是否为 1NF 取决于您要在此 table 上存储的值,正如我上面提到的,一个 应该只存储 一种类型的值,例如ID、地址、姓名等。列值的外观决定取决于设计以及您需要如何存储数据。如果不需要分别查询 fistname, middlename, lastname, secondname ,那么只需要将它们全部保存在一列中即可 FullName 并且它仍然是 1NF。但是如果你分别需要它们,你可以将它们存储在单独的列中,同样它仍然是 1NF,但它可能违反其他规则。

以下是一些您可能会觉得有用的教程:https://www.studytonight.com/dbms/first-normal-form.php

让应用程序及其使用方式指导您确定哪些数据应该进一步拆分(或不拆分)。

例如; 如果在您的应用程序中,您经常将名字与姓氏分开,以便您可以在通信中说“嗨,乔”,您应该将 fullName 分成两个字段。相反,如果您有两个字段 firstName 和 lastName,并且总是将它们连接起来以便您可以正确地处理信封,那么将这两个字段存储在 table.[= 的单个列中会更有意义。 10=]

在实践中,考虑到这两种情况的常见程度,数据库在上述示例中显示一些反规范化的情况并不少见,但风险是如果有人更新名字(例如),它们就会不同步但不更新全名。

考虑一下如果您决定使用单列 fullName,您将如何强制用户遵循特定模式。如果您的应用程序需要“Joe Smith”,您将如何防止“Smith, Joe”?

日期是另一个很好的例子,是否将这些部分分成单独的列取决于它们的使用方式。

指示行插入时间的日期时间字段可能不需要拆分,但如果您有许多只对年份感兴趣的查询(例如),拆分它可能有意义出。

这只是表面现象,这就是为什么这个答案更多地是关于如何思考潜在问题的原因。是的,由于各种原因,规范化您的数据库很重要,但是您使用它的程度取决于您的数据在一天结束时的使用方式。