gpt4 book ai didi

database - 两张表到一张表的关系

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:35:21 26 4
gpt4 key购买 nike

我在设计数据库的一部分以及它们之间的关系时遇到了一些麻烦。

我的实体是:

  • 车辆 -> 1:1 -> 价格
  • 自行车 -> 1:1 -> 价格

选项 A:

创建2个表

车辆表

+----------------+---------+
| NAME | TYPE |
+----------------+---------+
| Id | uuid |
| brand | varchar |
| model | varchar |
| attribute1 | varchar |
| price | float |
| discount float | |
| locale varchar | |
+----------------+---------+

自行车 table

+----------------+---------+
| NAME | TYPE |
+----------------+---------+
| Id | uuid |
| vendor | varchar |
| attribute1 | varchar |
| attribute2 | varchar |
| attribute3 | varchar |
| price | float |
| discount float | |
| locale varchar | |
+----------------+---------+

选项 B

创建 3 个表

车辆表

+----------------+---------+
| NAME | TYPE |
+----------------+---------+
| Id | uuid |
| brand | varchar |
| model | varchar |
| attribute1 | varchar |
+----------------+---------+

自行车 table


+----------------+---------+
| NAME | TYPE |
+----------------+---------+
| Id | uuid |
| vendor | varchar |
| attribute1 | varchar |
| attribute2 | varchar |
| attribute3 | varchar |
+----------------+---------+

价格表

+----------------+-------+
| NAME | TYPE |
+----------------+-------+
| vehicle_id | FK |
| bike_id | FK |
| price | float |
| discount float | |
| locale varchar | |
+----------------+-------+

选项 C

创建 4 个表

车辆表

+----------------+---------+
| NAME | TYPE |
+----------------+---------+
| Id | uuid |
| brand | varchar |
| model | varchar |
| attribute1 | varchar |
+----------------+---------+

车辆价格表

+----------------+-------+
| NAME | TYPE |
+----------------+-------+
| vehicle_id | FK |
| price | float |
| discount float | |
| locale varchar | |
+----------------+-------+

自行车 table


+----------------+---------+
| NAME | TYPE |
+----------------+---------+
| Id | uuid |
| vendor | varchar |
| attribute1 | varchar |
| attribute2 | varchar |
| attribute3 | varchar |
+----------------+---------+

自行车价格表

+----------------+-------+
| NAME | TYPE |
+----------------+-------+
| bike_id | FK |
| price | float |
| discount float | |
| locale varchar | |
+----------------+-------+

注意:我真的简化了车辆和自行车表(我不能像“产品”一样将它们合并到一个表中)

我们会从性能模式的角度进行什么设计?

最佳答案

如果您需要将所有价格都放在一个表中(用于排序等),则选项 B 很好,尽管您可能希望对价格表进行约束,使每一行都准确地引用车辆或自行车,但两者都没有,也没有。

请注意,在这里您可以拥有没有价格的车辆或自行车。

另一种方法是反转外键关系,并有三个这样的表:

PRODUCTS TABLE
+----------------+---------+
| NAME | TYPE |
+----------------+---------+
| product_id | uuid |
| price | float |
| discount | float |
| locale | varchar |
+----------------+---------+
VEHICLES TABLE
+----------------+---------+
| NAME | TYPE |
+----------------+---------+
| Id | uuid,FK |
| brand | varchar |
| model | varchar |
| attribute1 | varchar |
+----------------+---------+
BIKES TABLE
+----------------+---------+
| NAME | TYPE |
+----------------+---------+
| Id | uuid,FK |
| vendor | varchar |
| attribute1 | varchar |
| attribute2 | varchar |
| attribute3 | varchar |
+----------------+---------+

现在您可以拥有既不是自行车也不是车辆的产品,并且您可以同时拥有自行车和车辆的产品。缺点是对于给定的产品,您不知道它是什么。

另一方面,该方案允许强制每辆车和每辆自行车都有价格。


既然你问的是模式的观点,那方面的解决方案就是使用 composite type for your prices .价格不是一个实体(有自己的身份),它只是自行车和车辆使用的一个值。这里我们只有两个表:

PRICE _TYPE_
+----------------+---------+
| NAME | TYPE |
+----------------+---------+
| value | float |
| discount | float |
| locale | varchar |
+----------------+---------+
VEHICLES TABLE
+----------------+---------+
| NAME | TYPE |
+----------------+---------+
| Id | uuid,FK |
| brand | varchar |
| model | varchar |
| attribute1 | varchar |
| price | price |
+----------------+---------+
BIKES TABLE
+----------------+---------+
| NAME | TYPE |
+----------------+---------+
| Id | uuid,FK |
| vendor | varchar |
| attribute1 | varchar |
| attribute2 | varchar |
| attribute3 | varchar |
| price | price |
+----------------+---------+

这将等同于您的解决方案 A,但代码重用更好。此外,price 字段现在可以作为一个完整的结构为空,而不是在其各个部分。

但是,从性能和可用性的角度来看,我建议避免使用复合类型,因为使用它们很麻烦。您宁愿选择解决方案 A 并手动保持与价格相关的列定义同步。

关于database - 两张表到一张表的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58596318/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com