【问题标题】:Save value from last year in current table在当前表中保存去年的值
【发布时间】:2020-09-01 01:56:26
【问题描述】:

这是一个关于数据库设计的更普遍的问题。 我目前正在将 Excel/VBA 程序迁移到 SQL 并遇到以下情况,我需要深思熟虑,因为我是第一次这样做。

excel中的现状: excel sheet

到目前为止的部分新 MySQL 表:

+--------------+-------------------+---------+----------+-------+---------------+
| licenseplate | mileage_last_year | january | february | march | first_quarter |
+--------------+-------------------+---------+----------+-------+---------------+
| BP 11-111    |              NULL |     100 |      100 |   100 |           300 |
| BP 11-222    |              NULL |     561 |     1111 |   707 |          2379 |
+--------------+-------------------+---------+----------+-------+---------------+

“first_quarter”等都是生成的列,目前没有问题。

但是将当前年份的里程保存到下一年的最佳做法是什么?

  1. 每年一个新表并从前端查询,具体取决于用户的选择?
  2. 每个车牌/汽车和年份的新行,并且只在前端显示当前年份?

【问题讨论】:

  • 将您的数据标准化为(licenseplate, year, month, value)。所有值(包括年初和季度中间总和的值)都必须通过查询获得。
  • 不要将数据库视为更大版本的电子表格,

标签: mysql sql database database-design


【解决方案1】:

首先,您需要确定要存储的数据的粒度: 这里是年、月级别的里程。因此,您可以相应地决定表结构和粒度。

您需要规范化为不同的表。

  • 年表(年)
  • 月表(MonthId,MonthName,QuarterName)

  • 牌照表(LicensePlateId,LicensePlateName)

  • 里程表(LicensePlateId, Year, MonthId, Milage)

您现在可以得出车牌在特定年份和月份的里程数。您可以在需要时在季度级别聚合值。

注意:您可以将年、月信息合并到单个 calendarMonthTable(CalendarId, Year, Month, MonthName, QuarterName) 中,也是月级别的粒度。

【讨论】:

  • 不要“过度规范化”。特别是不要标准化日期。
  • @RickJames,同意你的看法。这就是原因,我提到他可以拥有包含月份级别信息的 calendarMonth 表。
【解决方案2】:

数据库是数据的持久存储。在格式化方面,不要认为数据库具有电子表格的强大功能;那是给前端的。

“到目前为止没问题”——错误。

不要跨列放置一个数组。相反,每个月有一行。

通常最好在客户端进行格式化,而不是 SQL。但是可以“旋转”以将月份放在输出中。

应该计算总计和小计,而不是存储。

"new table for each ..." -- 几乎总是一个糟糕的架构设计。 许多 StackOverflow 上的问题都会问这些问题;答案总是一样的:“不”。

“每个车牌/汽车和年份的新行,只显示当前年份”——这可以在 SQL(稍微复杂)或前端处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    • 2015-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多