【发布时间】:2014-06-07 20:58:45
【问题描述】:
我觉得这是一个非常基本的问题,尽管我已经在数据库方面做了很多工作,但我仍然想不出一个好的方法。谷歌搜索时似乎也找不到任何东西。
假设我有一堆表,每个表都描述了一种项目。
例如:
Table candles:
id█ name █length█diameter▌burntime▌
▀▀█▀▀▀▀▀▀▀▀█▀▀▀▀▀▀█▀▀▀▀▀▀▀▀█▀▀▀▀▀▀▀▀▌
1 █ candle1█54 █ 6 █ 180 ▌
69█ candle2█29 █ 16 █ 145 ▌
80█ candle3█100 █ 40 █ 110 ▌
Table coasters:
id█ name █thickness█diameter▌color ▌
▀▀█▀▀▀▀▀▀▀▀█▀▀▀▀▀▀▀▀▀█▀▀▀▀▀▀▀▀█▀▀▀▀▀▀▀▀▌
1 █coaster1█5 █ 20 █#ffffff ▌
6 █coaster2█8 █ 41 █#ff0051 ▌
8 █coaster3█7 █ 38 █#002199 ▌
Table baskets:
id█ name █size█
▀▀█▀▀▀▀▀▀▀▀█▀▀▀▀█
1 █basket1 █5 █
2 █basket2 █8 █
3 █basket3 █22 █
现在我有另一张桌子。我们称之为购物车。此表中的每条记录都需要保存这些项目的数组。这是我不知道如何进行的地方。 所以我需要一个多对多的关系,这意味着我需要一个连接/数据透视表。 但是怎么做呢?
我应该为每种类型的项目设置一个连接表吗?外键用于购物车 ID,外键用于蜡烛/杯垫等的记录 ID。 然后在列出购物车的内容时,我需要检查每个连接表,每种类型的项目都有一个。对我来说听起来不是很干净。
或者我应该只有一个联结表,其中有一列用于表名,另一列用于记录 ID? 看起来也很脏。
我想有更好的方法可以做到这一点,但我想不出。 这应该怎么做?
【问题讨论】:
-
或者我应该只有一个联结表,其中有一列是表名,一列是记录 ID? 是的,如果你已经拥有所有这些桌子!你不喜欢它的什么?
-
如果你打算有一个'shoppingcart'表,那么你需要区分物品作为产品,它们在哪里有数量、价格等,以及它们的产品细节,这就是你所拥有的更多。因此,也许可以考虑一个链接回单个详细信息的产品表,但也存储库存中的数量、价格等。目前您的模型的主要弱点是新产品类型需要一个全新的表。另见:stackoverflow.com/questions/9125029/… 例如。
-
实际上,更好的解决方案是将当前内容存储在两个表中,例如
goods(id, name) 和goods-properties(id, goodsId, property, value),其中“财产”将是例如size和值将是例如5(用于篮子 1) -
您应该将所有产品及其属性保存在一个表中,在第二个表中您应该保留他们的库存,并且您应该将您的订单保存在另一个表中..所有表应该通过外部相互链接钥匙....
-
@TomasPastircak 您的第一条评论.. 对我来说,让每个联结记录都有一个表名的 (varchar?-) 字段,而不是一个漂亮的 32 位整数 id,这感觉很不干净就像我习惯的那样。那么不可能为这些中的任何一个添加索引外键?