规范化总是必要且更有效吗?

Is normalization always necessary and more efficient?

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

中收集看起来像这样的数据

TABLE: 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 永远不会改变。所有其他数据每天都可以有其他值。如果我理解正确的话,规范化会使它看起来像这样:

TABLE: CAR_CONSTANT

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

TABLE: 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 创建一个额外的 table 是否有意义?

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

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

优点:

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

缺点:

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

直接回答您的问题:

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