【问题标题】:Storing NULL vs not storing NULL in the following table design在下表设计中存储 NULL 与不存储 NULL
【发布时间】:2022-01-12 03:10:30
【问题描述】:

这是一个关于存储空值(或不存储)的问题,有两个很好地回答了空值的使用的答案是:

假设我想存储存储在 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


【解决方案1】:

存储 NULL 值没有任何问题。在您的情况下,您可以将其视为 OR 语句。您不会编写多个 IF。您可以编写一个带有一些 OR 条件的 IF。

您提出了另一种解决方案,即创建更多表以避免使用 NULL 值。您不会消耗更少的磁盘/内存空间,因为附加到您将拥有 TitleID 属性的属性。查询会更难。您将不得不创建更多的连接,并且您的查询将花费更多的处理时间(这通常是大型应用程序的瓶颈),并且您不会对这种方法有任何优势。您浪费了更多的磁盘空间、更多的内存、更多的处理时间,并且您的查询将变得更大、更丑陋且更难理解。

因此,考虑到所有因素,将所有这些属性都放在一张表中,并且不要担心 NULL 值。实际上,他们会很好地为您服务!想象一下,如果您想查询“未添加剧情的电影”或“未添加年份的电影”,您可以请求观众帮助输入信息。在这些情况下,NULL 可以成为您的朋友。希望这个解释有帮助:)

【讨论】:

    【解决方案2】:

    是对你的数据进行归一化,还是使用null,可以认为是单独的问题,不会相互影响。

    • 规范化的原因可以是避免冗余(重复数据)、确保特定表中只有相关信息、简化查询或避免数据修改问题。

    • 是否存储 NULL 值更多的是在数据中将值设为 NULL 是否有意义,而不是作为默认值。例如,如果指定数据不存在会更正确,而不是提供一些默认值。

    “进一步规范化”数据库有什么好处吗? 例如,我不存储任何空值,例如....:

    归一化有1NF、2NF、3NF..等不同形式。每一级归一化的目的是为了获得一些好处,避免维护和查询数据的常见问题。

    根据您的用例,进一步规范化可能是有意义的,或者将您的开发时间投入到其他地方可能是有意义的。没有正确或错误的答案 - 在一般的软件工程中,人们总是在如何投资他们的资源方面进行权衡:提高一个功能的质量,而不是投资于几个等 每一次时间投资都会得到回报,只有构建人员才能最好地理解并维护产品。

    团队前进的一种常见方式是让他们的近期和近期业务需求来定义他们如何投资开发资源以立即获得一些切实的利益,但您应该决定什么最适合您和您的团队,具体取决于您的情况,以及您希望在对您重要的时间范围内实现的目标。

    【讨论】:

      猜你喜欢
      • 2012-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-25
      • 2022-01-16
      • 1970-01-01
      相关资源
      最近更新 更多