许多 DBMS 开始允许在数据库中使用 JSON。这违反了 1NF 吗?
1NF 的规则之一是不要在一列中存储多个值。但我们存储的是 JSON,它可以包含键值对。这违反规定了吗?
如果您将单个 JSON 列视为原子属性列,那么对于普通形式来说就很好。
当人们尝试将 JSON 文档中的字段视为属性列时,问题就出现了。针对 JSON 字段进行搜索、排序、连接、聚合等,就像它们是离散属性一样。
这比违反 1NF 更糟糕。它违反了关系的基本定义。所以它甚至不能满足1NF的前提条件。
回复@VladMikheenko 的评论:
关系具有固定数量的属性。它有一个定义属性的名称和数据类型的标题,并且有一组行,其中每行都具有与标题中定义的完全相同的属性。
JSON 的优点是您可以在 JSON 文档中的任何行上拥有不同的属性。这使得它可以灵活地存储数据,因为您可以在设计时间后添加更多属性,而无需重构表。
但这使得 JSON 不符合关系的定义。您不能依赖 JSON 文档中的任何属性出现在所有行上。所以它打破了约束和表达。它增加了代码的复杂性,因为在引用属性值之前,您必须不断检查属性是否已设置。