我在关于数据库管理系统的第一范式(1NF)中读到了以下内容:
其中有这样一句话:
“每个列应该是原子性的。”
请问有人可以举例详细解释一下吗?
其中有这样一句话:
“每个列应该是原子性的。”
请问有人可以举例详细解释一下吗?
关于"原子性"
在Codd最初的1969年和1970年的论文中,他将关系定义为每行都有一个属性值。该值可以是任何东西,包括一个关系。这没有使用"原子性"的概念。他解释说,"原子性"意味着非关系值(即非表值):
到目前为止,我们已经讨论了在简单域上定义的关系示例——元素为原子(不可分解)值的域。在关系框架内可以讨论非原子值。因此,某些域可能具有关系作为元素。
他在口头表述中使用了"简单"、"原子"和"不可分解"等词汇。他理解关系具有行,每列都有一个相关联的名称和值;按定义,属性是"单值"的;该值可以是任何类型。在关系上唯一重要的结构属性是成为关系。它也只是一个值,但您可以通过关系查询它。然后他使用"非简单"等词汇来表示关系值。
在Codd的1990年著作《数据库管理的关系模型:版本2》中,从数据库角度来看,数据可以分为两种类型:原子和复合。DBMS(不包括某些特殊功能)无法将原子数据分解为更小的部分。由结构化组合的原子数据组成的复合数据可以被DBMS分解。在关系模型中,只有一种类型的复合数据:关系。每个关系定义的域中的值需要在DBMS方面是原子的。关系数据库是各种程度关系的集合。所有查询和操作运算符都在关系上,它们都生成关系作为结果。为什么只关注一种类型的复合数据?主要原因是任何额外的复合数据类型都会增加复杂性而不增加功率。“在关系模型中,只有一种类型的复合数据:关系。” 很遗憾,“原子=非关系”不是你将要听到的内容。(不幸的是,Codd并不是最清晰的作者,他的解释性言论常常与他的底线混淆。)实际上,关系模型的几乎所有演示都没有超越Codd仅仅作为一个跳板的地步。它们推广了一个不太有用、混乱模糊的概念,被规范化为“原子”,决定了“规范化”。有时候他们错误地使用它来定义关系。而Codd则使用日常的“非原子”来引入定义关系的“非原子”作为关系值,并将“规范化”定义为无关系值域。原子性和第一范式...这不是关于原子事务,而是关于定义和列内容。
"原子"意味着“不能被分割或分成更小的部分”。应用于第一范式,这意味着一列不应包含多个值。它不应组合或结合具有自己意义的值。
这通常涉及到数据库设计人员经常犯的两个常见错误:
包含一系列值的列,通常是空格或逗号分隔的,例如此博客文章表:
id title date_posted content tags
1 new idea 2014-05-23 ... tag1,tag2,tag3
2 why this? 2014-05-24 ... tag2,tag5
3 towel day 2014-05-26 ... tag42
id room phones
4 432 111-111-111 222-222-222
5 456 999-999-999
6 512 888-888-8888 333-3333-3333
id fullname address
1 Mark Tomers 56 Tomato Road
2 Fred Askalong 3277 Hadley Drive
3 May Anne Brice 225 Century Avenue - apartment 43/a