我在 SO 上问了一个类似的问题,并被建议在这里问问题类型。这是关于关系数据库的课程。一个示例问题询问“为什么关系数据库中的每个表都应该是第一范式”我的第一个问题是 3NF 是否被认为更好,所以该陈述不会是错误的吗?我的第二个问题是人们说第一范式很好,因为它消除了冗余。我不明白它是如何做到这一点的,因为 1)所有值都是原子的 2)有一个主键 - 这两者都不能消除冗余。
我想另一种方式来问它为什么值是原子的很重要?
我在 SO 上问了一个类似的问题,并被建议在这里问问题类型。这是关于关系数据库的课程。一个示例问题询问“为什么关系数据库中的每个表都应该是第一范式”我的第一个问题是 3NF 是否被认为更好,所以该陈述不会是错误的吗?我的第二个问题是人们说第一范式很好,因为它消除了冗余。我不明白它是如何做到这一点的,因为 1)所有值都是原子的 2)有一个主键 - 这两者都不能消除冗余。
我想另一种方式来问它为什么值是原子的很重要?
第一范式最重要的不是消除冗余,而是消除重复组。
与其在一条记录中包含多列相同类型的数据,(0NF)您将重复的信息删除到一个单独的关系中并将它们表示为行。这就是构成 1NF 的原因。
具有以下列的表:
phone_1
,phone_2
,phone_3
或包含面向列表的数据,例如:212-555-1212, 212-555-1234, 416-967-1111
违反 1NF。1NF 很重要,因为它比 0NF 灵活得多,同时在插入、更新和读取数据时更容易使用。这是因为每种类型的数据元素(例如客户电话号码)都只有一列可以找到它,而该列对于每条记录只有一条数据。这意味着您可以使用简单的 SQL 语句来读取或写入单个数据元素,而无需解析分隔字符串或使用诸如:
where phone_1=@Number or phone_2=@Number or phone_3=@Number
等结构。关于 1NF 与 3NF,范式是累积的。3NF 中的表也在 1NF 中,所以说“关系数据库中的每个表都应该在 1NF 中”就像说“关系数据库中的每个表都应该在 3NF 中”一样正确。我会说这两个都是真的,但我会补充说“除非你有一个非常好的、经过深思熟虑的非规范化理由”。
“我想另一种问法是为什么价值观是原子的很重要?”
我目前正在使用在 varchar/text 字段中具有逗号分隔值的应用程序,这很麻烦。除其他外,在应用程序中,您必须执行所有愚蠢的字符串拆分和转换才能以正确的形式获取数据,而在数据库方面,您不能在字段上使用索引,因为所有搜索都必须打开表格 WHERE mycolumn LIKE '%search%'
还有其他原因,但首先想到的是这两个。
1NF 确实消除了冗余,它还有助于减少或消除数据一致性问题。
假设您有一个 表
Invoices
,其中包含付款数据和客户数据。客户数据是 , , 等信息
Name
。Address
如果PhoneNumber
您在每一行上复制此数据...Invoice
记录中都有相同的详细信息)Customer
Address
的值Customer
,哪个是正确的?Address
表比检查Invoice
表中的当前地址更有意义。第一种范式意味着消除将关系作为成员的域 - 换句话说,消除允许表作为值的列。
在 1NF 的上下文中,“原子”仅表示不是关系的任何类型,因为这些值相对于关系代数是原子的。所以说价值观应该是原子的,就等于说关系不应该有作为价值观的关系。
第一个范式是必要的,因为关系数据语言(实际上是 SQL)不支持嵌套表。嵌套表也不必要地使数据模型复杂化,因为相同的信息可以通过外键表示。
但是,第一范式并没有消除数据中的冗余。更高的范式消除了不同形式的冗余,但 1NF 并非如此。
范式建立在彼此的基础上,即表格必须在 1NF 中,然后才能在 2NF 中,依此类推。所以 3NF 意味着数据库也在 1NF 中。