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 / 问题 / 40850
Accepted
Apocatastasis
Apocatastasis
Asked: 2013-04-25 15:57:42 +0800 CST2013-04-25 15:57:42 +0800 CST 2013-04-25 15:57:42 +0800 CST

一对至多一个关系或多个空列?

  • 772

我有一个包含许多属性的表,这些属性可以按逻辑组进行分组,因此将这些属性放在单独的表中的想法似乎很有吸引力。逻辑组不代表实体本身。设置组中的一个属性后,还必须设置该组中的大多数其余属性(但不是全部)。组的字段类型一般为VARCHAR(15-20). 也没有BLOB或TEXT字段。

逻辑组不代表子类型,因为它们不是相互排斥的。

实体被要求更多地阅读而不是写作。因此一张大桌子看起来很合适。此外,这种方式在查询中避免了连接。我不喜欢这种方法的部分是大量可为空的字段。

寻求专家建议。

database-design
  • 1 1 个回答
  • 784 Views

1 个回答

  • Voted
  1. Best Answer
    Joel Brown
    2013-04-26T02:01:33+08:002013-04-26T02:01:33+08:00

    可为空的列没有任何问题,即使是很多,如果那是您的数据域所要求的。

    另一方面,您说这些列可以按逻辑分组这一事实对我来说意味着可能发生了其他事情。

    如果因为不同的列集适用于不同的行集而可以对它们进行逻辑分组,那么您可能会遇到实体子类型的情况。

    相反,如果列可以分组,因为它们适用于不同的时间,那么您可能会遇到规范化问题。例如,如果您的列类似于“一月销售额”、“二月销售额”等,这些列应该是子表中的行。

    虽然可为 null 的列本身没有任何问题,但加入也没有任何问题。这就是 RDBMS 谋生的目的。

    更新:

    给定有关列的逻辑组的附加信息:

    有两种子类型可以使用 1:1 关系在数据库中表示。如果逻辑组相互排斥,那么父实体可能具有所谓的分区属性,告诉您哪个子类型适用。但是,如果没有分区属性,则可能同时适用零个、一个甚至多个子类型。

    同样的基本问题适用于你如何处理这种情况。

    解决它的一个好方法是查看列的逻辑组。逻辑组 A 中的列与逻辑组 B 中的列相同 - 还是完全不同?如果它们不同,则最好在具有可为空字段的单个表中对它们进行建模。如果它们相同,那么这可能表明它们应该是多个子行。

    另一个要看的线索是,一组逻辑列可以拥有自己的生命并开始吸引来自其他表的关系是否有意义。如果逻辑组 B 可能很快发现自己有来自另一个表的多个子记录,那么它可能是一个标志,表明将该组提升到它自己的子类型样式表是有意义的。

    最后要考虑的一件事是物理实现。如果逻辑子组的填充非常稀疏,您可能能够将这些列分离到另一个表中以优化物理存储。此步骤不应主动完成。这种优化应该在性能测试证明有必要时进行。

    如果这些都不是真的,那么您最好将可空列保留在原始表中。

    • 5

相关问题

  • 过滤索引是否有助于改进基于输入时间的查询,还是应该避免这种情况?

  • MySQL VARCHAR 和 TEXT 数据类型有什么区别?

  • 存储计算值或根据要求重新计算它们更好吗?[复制]

  • 存储与计算聚合值

  • 在数据仓库中实现多对多关系有哪些方法?

Sidebar

Stats

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

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

    • 3 个回答
  • Marko Smith

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

    • 3 个回答
  • Marko Smith

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

    • 4 个回答
  • Marko Smith

    授予用户对所有表的访问权限

    • 5 个回答
  • 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
    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
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +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