【问题标题】:Is normalization always necessary and more efficient?标准化总是必要的和更有效的吗?
【发布时间】:2021-04-22 02:57:42
【问题描述】:

我进入了数据库和规范化。我仍在尝试理解规范化,但我对它的用法感到困惑。我将尝试用这个例子来解释它。 每天我都会在一个表中收集如下所示的数据:

表格:CAR_ALL

ID DATE CAR LOCATION FUEL FUEL_USAGE MILES BATTERY
123 01.01.2021 Toyota New York 40.3 3.6 79321 78
520 01.01.2021 BMW Frankfurt 34.2 4.3 123232 30
934 01.01.2021 Mercedes London 12.7 4.7 4321 89
123 05.01.2021 Toyota New York 34.5 3.3 79515 77
520 05.01.2021 BMW Frankfurt 20.1 4.6 123489 29
934 05.01.2021 Mercedes London 43.7 5.0 4400 89

在此示例中,我每天获取数千辆汽车的数据。 ID、CAR 和 LOCATION 永远不会改变。所有其他数据每天都可以有其他值。如果我理解正确,规范化将使它看起来像这样:

表:CAR_CONSTANT

ID CAR LOCATION
123 Toyota New York
520 BMW Frankfurt
934 Mercedes London

表格:CAR_MEASUREMENT

GUID ID DATE FUEL FUEL_USAGE MILES BATTERY
1 123 01.01.2021 40.3 3.6 79321 78
2 520 01.01.2021 34.2 4.3 123232 30
3 934 01.01.2021 12.7 4.7 4321 89
4 123 05.01.2021 34.5 3.3 79515 77
5 520 05.01.2021 20.1 4.6 123489 29
6 934 05.01.2021 43.7 5.0 4400 89

我有两个问题:

  1. 为 DATE 创建一个额外的表有意义吗?

  2. 通过收集的数据可能会包含新车。 对于插入CAR_MEASUREMENT 的每一行,我都必须检查ID 是否已经在CAR_CONSTANT 中。如果它不存在,我必须插入它。 但这意味着我必须每天检查数千次CAR_CONSTANT。如果我只是将整个数据作为 1 行插入到CAR_ALL 中会不会更有效率?我不必每次都检查CAR_CONSTANT

【问题讨论】:

    标签: database database-design database-normalization


    【解决方案1】:

    标准化的好处取决于您的具体用例。我可以看到规范化您的架构的利弊,但如果不了解您的用例,就不可能说哪个更好。

    优点:

    • 使用您的架构,规范化可以减少您的数据库消耗的数据量,因为 CAR_MEASUREMENT 可能会比 CAR_CONSTANT 大得多。如果您能够将其他数据分解到 CAR_CONSTANT 中,这会扩大规模。
    • 如果您开始跟踪有关汽车的其他固定数据(例如车牌号),规范化还可以提高数据一致性。您可以简单地更新 CAR_CONSTANT 中的一行,而不是 CAR_ALL 中可能的数千行。
    • 规范化的数据结构可以使查询特定汽车的数据变得更加容易。使用 LEFT JOIN,DBMS 可以根据整数 ID 列搜索 CAR_MEASUREMENT 表,而不必比较两个字符串列。

    缺点:

    • 正如您所指出的,规范化形式需要额外的查找,并且每次添加到 CAR_MEASUREMENT 时都可能插入到 CAR_CONSTANT。根据您收集这些数据的速度,这些额外的查询可能会产生过多的开销。

    直接回答您的问题:

    1. 我不会只为日期创建一个额外的表。日期是 CAR_MEASUREMENT 数据的一部分,不应分开。我能想到的唯一例外是,如果您最终将收集不包含任何汽车数据的测量值。在这种情况下,将 CAR_MEASUREMENT 拆分为单独的 MEASUREMENT 和 CAR_DATA 表是有意义的,其中 MEASUREMENT 包含日期,而 CAR_DATA 仅包含特定于汽车的数据。
    2. 见上文。如果您有一个用例来查询特定汽车的数据,那么规范化形式会更有效。如果不是,那么额外的 INSERT 开销可能不值得。

    【讨论】:

    • 感谢您的回答。在这个用例中,我将查询每日汽车信息并将其映射到图表和世界地图。由于我将主要按 DATE 查询(而不是按特定汽车),我想规范化是不必要的?
    • @ma7y 对于那个用例,我不会为标准化而烦恼。如果需要,以后迁移到规范化模式并不难。
    猜你喜欢
    • 2011-04-10
    • 2018-02-28
    • 1970-01-01
    • 2018-11-06
    • 2015-05-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-15
    • 1970-01-01
    相关资源
    最近更新 更多