在关系数据库中设计通用值的正确方法是什么?
示例 - 表格
car_make
:
id | 名字 |
---|---|
1 | 欧宝 |
2 | 宝马 |
表
car_model
:
id | 名字 | make_id |
---|---|---|
1 | 阿斯特拉 | 1 |
2 | 威达 | 1 |
3 | I7 | 2 |
4 | X4 | 2 |
5 | 其他 | ? |
在该示例中,我希望每个品牌都有额外的“其他”模型,尽管有其型号。
如果我们省略“其他”值,一对多关系似乎是最合乎逻辑的,因为每个品牌都有自己的模型。但是,如果我们为数千个品牌引入多对多关系,只是为了每个品牌都有“其他”模型,这不是浪费资源吗?
这取决于您计划如何在应用程序中查询数据库。就我而言,“其他”模型仅在您对每个 car_make 的查询进行分组时才相关,例如,当您尝试聚合每个 car_make 及其对应的 car_model 的销售额时。如果您对每个 car_make 中“other”作为 car_model 的命名约定保持一致,您还可以使用该名称过滤查询,例如:大写 O 的“Other”。
关于资源浪费,我们尝试比较一下多对多和一对多。在多对多中,我们需要引入一个中间表,我们称之为car_model_x_make。另外,为了让您了解查询多对多关系是多么困难,这里有一个获取 BMW 创建的 car_model 的示例。
SELECT car_model.name FROM car_make,car_model_x_make,car_model WHERE car_make.id=car_model_x_make.makeid AND car_model.id=car_model_x_make.modelid AND car_make.name='BMW'
如果您有 1000 个品牌,并且每个品牌都填充了 10 个独特的型号,再加上一个“其他”型号,这意味着 car_make 表将有 1000 行,每行 2 个基本列,car_model 将有 10001 行,每行 2 个基本列列,car_model_x_make 将有 11000 行,每行 3 个基本列。总而言之,将会有 55002 必需细胞。
相比之下,一对多关系只会用 35000 基本单元填充您的数据库,其中包含 car_make 中 1000 行 2 个基本列,以及 car_model 中 11000 行 3 个基本列。