为什么在RDBMS中存储“集合”类型被认为违反了1NF?

时间:2011-06-17 02:51:42

标签: database database-design rdbms

关注this question

维基百科说:

http://en.wikipedia.org/wiki/First_normal_form#Repeating_groups_within_columns

  

诸如“哪对客户共享电话号码?”之类的查询。更难以制定

这怎么可能难以制定?两组相交非常简单。

那么为什么RDBMS没有提供存储arraw / set / list的方法呢?

3 个答案:

答案 0 :(得分:2)

在您链接到与

进行比较的表格设计的文章中
Customer

Customer ID First Name Surname   Telephone Numbers
----------- ---------- -------   -----------------
123         Robert     Ingram    555-861-2025
456         Jane       Wright    555-403-1659, 555-776-4100
789         Maria      Fernandez 555-808-9633

VS

Customer Name

Customer ID First Name Surname
----------- ---------- -------
123         Robert     Ingram
456         Jane       Wright
789         Maria      Fernandez


Customer Telephone Number

Customer ID Telephone Number
----------- ----------------
123         555-861-2025
456         555-403-1659
456         555-776-4100
789         555-808-9633

在第二个设计中,“哪对客户共享一个电话号码”的查询可能是(忽略需要引用表和字段名称)

SELECT 
 a.telephone Number,
 a.Customer ID, 
 b.Customer ID
FROM 
 Customer Telephone Number a
 INNER JOIN  Customer Telephone Number b
 ON a.telephone Number = b.telephone Number

简单如馅饼

对于第一个设计,实际上没有任何标准SQL。每个RDMS都有自己的方式来解析逗号分隔的字段,它通常是皇家PITA而不是SARGable。

如果您对使用此SO搜索解析逗号分隔字段可能需要的内容感兴趣 https://stackoverflow.com/search?q=sql+comma+parse

您可能会在该搜索中找到阳光下的每个RDMS

从评论中更新

  

我不是故意用逗号分隔   字符串直接,但假设RDBMS   可以在内部处理“集合”,   SARGable操作可能仍然存在

这是一个有点不同的问题。答案是有些人这样做。例如,SQL Server的XML数据类型可以执行此操作,并且它是SARGable,因为您可以在它们上创建索引。

XML数据类型是否违反NF1?如果我没记错的话,CJ Date在“深度数据库:从业人员的关系理论”中没有提出反对意见,但我可以看到一些人可能会这样做。

答案 1 :(得分:1)

RDBMS支持基于关系代数的关系代数和语言。 RA对关系进行操作,关系是一组元组。因此,实现两组交集的最佳方法是使用关系而不是使用数组或列表。数组和列表与关系完全不同(例如,它们可以按位置寻址),因此要应用关系操作,比如首先将数组或列表转换为关系的交集。

  

http://en.wikipedia.org/wiki/First_normal_form#Repeating_groups_within_columns

给出的示例是使用逗号分隔的字符串来表示电话号码列表。正如文章指出的那样,这并不违反1NF - 其中带逗号的字符串仍然是单个值。但是,它不是一个非常实用的设计,因为它意味着您需要一系列字符串操作来解构单独的电话号码,以便将它们与其他电话号码进行比较。

请记住,SQL不是真正的关系语言,基于SQL的DBMS并不是严格意义上的RDBMS。在真正的RDBMS中,可以使用嵌套关系(属性内的关系)来表示单个属性中的值集。一些SQL DBMS确实支持嵌套表,但它们没有被广泛使用,因为使用它们的语法更复杂,并且可以通过创建新的非嵌套表来轻松避免它们。

答案 2 :(得分:0)

对象关系DBMS可以。它们允许设计类(例如MS SQL Server中的CLR类型)并将它们用作泛型类型。所以你可以在课堂上制作列表,数组,字典等等。但通常你不这样做,因为RDBMS中有一些名为 tables 的集合。将一组值封装到一个值中通常不利于性能,因为您无法在其上使用关系操作(由SQL提供)。 1NF是棘手的,因为并不总是清楚哪个被认为是单个值或一组值。这主要取决于您处理数据的方式。