1NF要求字段是原子的;也就是说,它应该只代表一个值。
他说,因为他不希望数据可搜索或可读,所以它不违反正常形式,并且该值代表单个对象。
他是对的吗?
答案 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提供这些功能,或者创建新类型的数据库设计者提供这些功能。