同事认为在数据库中存储序列化的数据串不会违反1NF

时间:2011-07-28 17:51:57

标签: database database-design

1NF要求字段是原子的;也就是说,它应该只代表一个值。

他说,因为他不希望数据可搜索或可读,所以它不违反正常形式,并且该值代表单个对象。

他是对的吗?

4 个答案:

答案 0 :(得分:3)

定义“原子”。

最近理论上的最新进展表明,1NF的定义(通常被理解为)所依赖的“原子性”概念是模糊的,并且可能完全不可定义。

例如,地图上的坐标是“原子”值吗?通常,这样的值具有清晰可见的“X”和“Y”组件,并且这些组件的值可以从“原子”值“拉出”。如果某些东西可以从其他东西中“抽出”,那么可疑的是,在通常的意义上,“其他东西”是“原子的”(即不能进一步分解)。

使用“地图上的坐标”类型的值然后违反1NF,正是因为这个原因?这个职位很难维持。

由于这些原因,一个包含CSV列表的字符串不会正式违反1NF。这并不是说在这个基础上实际设计数据库是一个非常好的主意。大多数时候,它不会。但从形式上讲,它并没有违反1NF(或其余的内容)。

答案 1 :(得分:2)

字符串是单个值。可以将其拆分为较小的字符串这一事实并不意味着您违反了1NF。如果您将大量信息编码为字符串,那么您可能无法充分利用您的DBMS功能(即查询数据并对其强制执行约束的能力),但这是一个不同的问题。

答案 2 :(得分:1)

问题在于单个值通常可以根据上下文实际分解为单独的值(例如,varchar可以是多个char值,并且浮点数可以是两个单独的数字)。如果序列化数据与表所代表的关系无关,则可能被视为1NF。

Address字段可以在通用ContactInfo表中包含街道名称城市,但该字段在Addresses中不会被视为原子对街道名称,城市,ZIP等具有单独属性的表格

答案 3 :(得分:1)

是的,你的牛人是对的。

目前的观点是单个值可以任意复杂。它甚至可以是一张桌子。 (在Chris Date的书中,查找“关系值属性”。)日期和时间戳是单个值,但它们都有内部结构。

但是如果某个类型具有内部结构,则dbms会忽略该内部结构(如果SELECT CURRENT_TIMESTAMP,则为SQL)或者它提供对该内部结构进行操作的函数(如如果你SELECT EXTRACT(YEAR FROM CURRENT_TIMESTAMP),SQL会这样做。

关键是用户不必编写任何过程代码来操纵该内部结构的内容。 dbms提供这些功能,或者创建新类型的数据库设计者提供这些功能。