AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 103855
Accepted
andreshg112
andreshg112
Asked: 2015-06-12 19:55:44 +0800 CST2015-06-12 19:55:44 +0800 CST 2015-06-12 19:55:44 +0800 CST

在关系数据库中为可能的空值创建另一个表会更好吗?

  • 772

我正在设计一个在MySQL中使用的关系数据库。我有下一种情况:在一个表中,大多数情况下的字段是NULL. 字段将如下所示:

Table name: tabla

Fields:
  idtabla not null,
  text (varchar(n)) not null,
  image (mediumblob) {this can be null}

疑问:最好创建另一个表,并在需要使用图像时查询新表?为什么您的解决方案更适合设计?MySQL的时间响应,易于查询等?

mysql database-design
  • 3 3 个回答
  • 2613 Views

3 个回答

  • Voted
  1. Best Answer
    David Spillett
    2015-06-13T01:03:50+08:002015-06-13T01:03:50+08:00

    您在这里触及了一个几乎是哲学的论点:是否应该允许 NULLable 值,因为它们违反了模型关系数据库源自的“封闭世界”假设(参见http://en.wikipedia.org/wiki的相关部分/Null_(SQL)和这里的许多其他问题,例如为什么我们不应该允许 NULL?为避免未知值将可能未知(或根本不适用于所有情况)的属性拆分为它们自己的关系(表),这样您就没有未知的值,而是如果值未知,则它根本不存在. 虽然这满足了理论,但也有一些实际意义使其不太理想:

    • 大多数 RDBMS 中的JOIN操作不是免费的,在额外的表中搜索属性会增加引擎为满足您的查询而需要做的工作。
    • 如果属性的存在不是相互依赖的(即每个属性都可以是未知的,而与其他属性无关),那么为了得出结论,您有时最终需要为每个属性创建一个表。
    • 额外的连接会增加查询的复杂性并降低可维护性。
    • 更新在某些地方也变得不那么直观:空白属性现在变成了一个 DELETE 操作,更新一个可能是 anINSERT或 an UPDATE。

    当然,在某些情况下,第一点是相反的,打破属性会提高效率:

    • 大多数 RBDMS 使用基于页面的存储,并且从核心数据中分离可选信息意味着您可以在给定页面中容纳更多核心数据行。根据您的数据大小、RAM 和存储基础设施,这对于减少某些大型查询所需的 IO 量可能非常重要(但通常不是:尽量不要在这一点上“过度优化”,至少在没有运行良好基准的情况下)以确保情况正在改善而不是恶化)。
      这当然是假设您的查询是经过设计的,因此它们只获取他们需要的内容,因此引擎无论如何都不需要关心额外信息中的绘图。
    • 同样,如果您只更新INSERTor中的核心信息UPDATE,并且如果您对这些额外属性有约束或触发器,则可能会在每次行更改时避免此处理。

    您的示例看起来像是在存储图像(或至少在 blob 类型列中存储大量数据。这里有两个额外的注意事项:

    • 大多数数据库引擎无论如何都会“离页”存储大数据,所以如果你避免的话,无论如何SELECT *你都会“免费”获得每页行数的奖励。
    • 将它们移动到其他地方是否允许您在多个实体之间共享大数据,而不是多次存储同一个 blob,或者信息(如果存在)对于给定行是否唯一?

    tl; dr:所以恐怕没有硬性和快速的答案。我的建议是做任何最适合你的数据概念模型的事情,因此你需要更少的思考来维护。这通常(但并非总是)意味着使用 NULLable 列而不是单独的表。除非您的数据确实非常庞大,否则性能差异将可以忽略不计。

    • 3
  2. Marco Borchert
    2015-06-13T00:51:56+08:002015-06-13T00:51:56+08:00

    单独的图像表是否有用取决于图像与原始表中其余属性之间关系的基数:

    如果满足以下任一条件,则单独的图像表是合理的:

    • 多行可能包含相同的图像:增强规范化,因为图像只需在图像表中存储一次,而不是在原始表中存储多次
    • 图像可以在没有其他属性的情况下存在;例如,如果一行的图像被交换/删除,这可以让您保留历史记录

    如果图像每行都是唯一的,我不会担心空字段,因为在这些情况下,如果使用单独的图像表,您将拥有空外键。

    SELECT *如果您决定将图像保留在原始表中,则仅在需要时检索它们可能是有益的(与任何数据一样,因此除非您需要所有可用数据,否则最好不要使用)。

    • 1
  3. Rajat Saxena
    2015-06-12T23:40:37+08:002015-06-12T23:40:37+08:00

    如果您创建一个新表,那么您可能需要一个“JOIN”来获取图像数据。连接会降低 RDBMS 的性能。但是在您的情况下,因为只有一个连接,所以它不会对整体查询性能产生太大影响。

    • -2

相关问题

  • 是否有任何 MySQL 基准测试工具?[关闭]

  • 我在哪里可以找到mysql慢日志?

  • 如何优化大型数据库的 mysqldump?

  • 什么时候是使用 MariaDB 而不是 MySQL 的合适时机,为什么?

  • 组如何跟踪数据库架构更改?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve