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 / 问题 / 259058
Accepted
Chris
Chris
Asked: 2020-02-07 08:58:08 +0800 CST2020-02-07 08:58:08 +0800 CST 2020-02-07 08:58:08 +0800 CST

可以在关系数据库中添加表年份吗?

  • 772

我如何向我的同事解释这是不必要的复杂性和冗余数据?

他想要一张年份表,因为许多表都有“年份”值,而且他还想要有名称和年份的关系表,这会增加不必要的内部连接和外来我坚持认为这是错误的,我只想确保这不是一个好习惯......

数据库图图片

sql-server mysql
  • 3 3 个回答
  • 298 Views

3 个回答

  • Voted
  1. Best Answer
    Rick James
    2020-02-11T10:34:40+08:002020-02-11T10:34:40+08:00

    vehicle_year应该是数据类型YEAR。

    日期应该是 datatype DATE。即使您需要将日期拆分为其组成部分,这样做几乎总是比使用包含日期及其部分的维度表更好。

    一般来说,不要“规范化”任何“连续”值——日期、整数、浮点数等。

    正如 kevensky 指出的那样,对于需要在缺失年份(或其他任何内容)显示零的“报告”,有一个用例可以朝另一个方向发展。但这并没有以任何方式链接到主表。相反,它被用来像

    SELECT y.year,
           COALESCE(SUM(m.stuff), 0),
           ...
        FROM Years AS y
        LEFT JOIN my_table AS m
        GROUP BY...
    

    请注意如何LEFT JOIN包括 Years 表中的所有年份。(您可能希望使用WHERE子句来限制范围。)

    而COALESCE是用来把NULL缺失的年份变成0。或N/A。或No data。管他呢。

    虽然我在这里,但我建议规范化“模型”也是“过度规范化”。Vehicle表格中拼出的型号名称非常好。

    什么时候应该正常化?

    • 不是唯一的——人们的名字。
    • 当值可能发生变化时——车主(但这需要一个多:多表)
    • 有很多辅助数据——公司(有地址等)
    • 节省空间——名字长,桌子大;不适用于 2-letter country_code 与 4-byte INT。

    型号年份是自我识别的,从不改变,不大,没有辅助数据。

    车辆品牌和型号大多与车型年份相似。同样适用于发动机尺寸、颜色、价格等。

    让我提出一个假设性的问题:“雪佛兰生产他们的 Impala 模型是几年(model_years,即)?”

    这可以通过“SELECT DISTINCT model_year FROM Vehicle WHERE make = ...;”来回答。这可以从表中的可用车辆中得到答案。

    或者,您可能从列出答案的历史网站上获得它。现在你需要一张桌子,上面有PRIMARY KEY(make, model)关于旧车历史的各种信息。

    这导致了一个更混乱的情况——分层信息。注:通用 > 雪佛兰 > Impala > LT。“位置”有类似的问题:美国 > 乔治亚 > 富尔顿县 > 亚特兰大 > 地址。通常,每个级别的规范化都是大材小用,应该避免。

    因为许多表都有“年份”值

    好吧,规范化的“教科书”论点在这里惨败。它说您应该规范化,以便将值放在一个位置以便于更改。但是,如果这year代表车辆的 model_year 在一张桌子上,但您孩子的生日在另一张桌子上,而您的毕业日期在另一张桌子上,那么您当然不想更改该值。

    将规范化表想象成一个“实体”,例如一个人、一个地方、一个公司、一张图片、一个网络帖子等。你给实体一个唯一的标识符 ( PRIMARY KEY) 以便每个人都可以轻松地引用它。在表格中,您有一个可打印的名称、一个位置、一个“点赞”计数器等。

    • 2
  2. kevinskio
    2020-02-07T09:08:43+08:002020-02-07T09:08:43+08:00

    我使用了一个年份表来报告使用适当数量的过滤器可能在该年没有任何结果的情况。客户仍然想查看当年的金额,即使它是零。通过拥有一张年份表,您可以保证每个年份都有一个值。另一种方法是进行外部连接,我认为这会因需要更多扫描而影响性能。

    您的用例可能会有所不同,但这并不总是一个坏主意

    • 1
  3. watery
    2020-02-07T09:08:47+08:002020-02-07T09:08:47+08:00

    作为一个快速的答案,我会说你正在使用一个数字来关联另一个数字——而且只有那个(那个年份表中没有额外的价值)。

    然后,正如您已经说过的,查询多年将需要额外的努力(连接、子查询等)。

    • 0

相关问题

  • 是否有任何 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