【发布时间】:2022-01-12 03:10:30
【问题描述】:
这是一个关于存储空值(或不存储)的问题,有两个很好地回答了空值的使用的答案是:
- What to do with null values when modeling and normalizing?
- Database: Can I have nullable attributes in a third normal form database?
假设我想存储存储在 iTunes 上的电影列表。为简单起见,我们将仅存储几个字段,以便电影 Avatar 具有以下值:
- 身份证号:354112018
- 姓名:头像
- 年份:2009
- 简介:“奥斯卡奖得主詹姆斯·卡梅隆执导的《阿凡达》讲述了这个故事......”
但是,有时缺少概要,例如:https://itunes.apple.com/be/movie/id437975371,有时缺少年份,尤其是对于未来或暂定版本,例如:https://itunes.apple.com/au/movie/id1598491343。
不假思索,我可能会创建一个表来存储这四个字段,如下所示:
- ID (INT)
- 名称(VARCHAR)
- 年份(INT NULL)
- 概要(VARCHAR NULL)
“进一步规范化”数据库是否有任何优势,例如,我不存储任何空值,例如:
标题
- 标题ID
- 姓名
标题概要
- 标题ID
- 简介
职称年份
- 标题ID
- 年份
在我看来,这样做可能会创建数百个额外的表(在大型数据库上)并使插入成为一场噩梦——我想可以创建一个视图来展平结果以便它可以查询,但即使我感觉它需要这么多开销。那么在上述情况下是否有任何理由进行规范化以删除空值,或者一般来说,如果有空值,该怎么办?
【问题讨论】:
-
像这样将单个表拆分为多个表通常称为“垂直分区”,因此如果您搜索它,您可能会发现一些支持和反对的用例。您需要对所有这些表进行外部联接,无论如何都会产生 NULL。就个人而言,这看起来过于复杂。如果你有无数个字段并且很多是 NULL,你可以在各种数据库中使用各种“稀疏”实现。
-
问题到底是什么?涉及子类型化的设计变体之间的这种重新排列不是规范化,也不能解决规范化解决的问题。您实际上并没有清楚地说明“进一步规范化”(或“变平”或“可查询”)的意思,因此这将阻碍您对其进行研究。 (将单词放在吓人的引号中并不能阐明您没有通过实际说出您的意思来阐明的特殊含义。)
-
数十种已出版的学术信息建模和数据库设计教科书以pdf和html形式在线免费提供。多读。最有说服力的信息建模方法是 Halpin 的 ORM2(对象角色建模),它是 Nijssen 的 NIAM“基于事实”方法的子代。 ORM2 的主要书籍 IM 和关系数据库(2 个版本)有章节将其映射到其他主要方法(ER 和伪前 ER。关系模型本身的介绍通常很差。阅读 Darwen 的关系数据库理论免费介绍。@987654327 @stackoverflow.com/a/34427859/3404097
-
When to use NULL in MySQL tables 等的可能重复等
标签: database database-design database-normalization