规范化总是必要且更有效吗?
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
我有两个问题:
为 DATE 创建一个额外的 table 是否有意义?
通过收集的数据,有可能会包含新车。
对于我插入 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。根据您收集此数据的速度,这些额外的查询可能会产生过多的开销。
直接回答您的问题:
- 我不会只为日期创建额外的 table。日期是 CAR_MEASUREMENT 数据的一部分,不应分开。我能想到的唯一例外是,如果您最终将收集不包含任何汽车数据的测量值。在这种情况下,将 CAR_MEASUREMENT 拆分为单独的 MEASUREMENT 和 CAR_DATA table 是有意义的,其中 MEASUREMENT 包含日期,而 CAR_DATA 仅包含特定于汽车的数据.
- 见上文。如果您有查询特定汽车数据的用例,那么规范化形式会更高效。如果不是,那么额外的 INSERT 开销可能不值得。
我进入了数据库和规范化。我仍在尝试理解规范化,但对它的用法感到困惑。我将尝试用这个例子来解释它。 每天我都会在一个 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 |
我有两个问题:
为 DATE 创建一个额外的 table 是否有意义?
通过收集的数据,有可能会包含新车。 对于我插入
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。根据您收集此数据的速度,这些额外的查询可能会产生过多的开销。
直接回答您的问题:
- 我不会只为日期创建额外的 table。日期是 CAR_MEASUREMENT 数据的一部分,不应分开。我能想到的唯一例外是,如果您最终将收集不包含任何汽车数据的测量值。在这种情况下,将 CAR_MEASUREMENT 拆分为单独的 MEASUREMENT 和 CAR_DATA table 是有意义的,其中 MEASUREMENT 包含日期,而 CAR_DATA 仅包含特定于汽车的数据.
- 见上文。如果您有查询特定汽车数据的用例,那么规范化形式会更高效。如果不是,那么额外的 INSERT 开销可能不值得。