5

我可以想到很多方法来解决这个问题,但我想知道这里的最佳做法是什么:

我有三张桌子。产品、价目表和价格。

一种产品可以属于多个价目表。

一个价目表可以属于许多产品。

这是一个多对多的关系,据我所知需要一个连接表(pricelist_products)。哪个效果很好。

现在,价格表中的一种产品可以有多个价格。产品只有在价格表中才会被赋予价格。

我在这里想到的是使用联结表'pricelist_products'中的ID作为价格表中的外键,但这感觉真的...... hacky?

ER图

鱼腥味的例子:

产品 1 - 钓鱼竿。

价目表 A - 渔民。

价目表 B - 钓鱼店。

价目表 A,产品 1,价格 1:(每月还款选项 1(无押金))

价目表 A,产品 1,价格 2:(每月还款选项 2(含押金))

价目表 A,产品 1,价格 3:(每季度还款)

价目表 B,产品 1,价格 1:(每季度还款)

4

2 回答 2

1

我在这里想到的是使用联结表'pricelist_products'中的ID作为价格表中的外键,但这感觉真的...... hacky?

也许这里的问题只是一种观点。联结表的目的是唯一地定义您的多对多关系中的每个组合(最初:pricelistto product)。这可以在具有字段product_idpricelist_id单独的联结表中实现,而无需代理键id

当然,如果您使用 定义联结表PRIMARY KEY (product_id, pricelist_id),则该表将缺乏在考虑时唯一定义组合的能力price。因此,您将第三个添加id到连接表中。在仅定义两个表之间的关系时,您似乎将此字段视为必要的代理键。但是,由于此字段的实际用途与第三个表相关,因此您可以将其命名为price_id,命名您的联结表pricelist_product_price,并在所有三个字段上定义主键(例如)。这更清楚地展示了每个领域的目的,因此在实践中可能不会感到“hacky”。

我不知道这是否是数据库设计的最佳实践,但请记住,没有理由必须完全规范化每个数据库。您想要具有合理数量的灵活性和可扩展性的良好性能(这对于休闲博客来说可能是一回事,而对于小型企业来说则是另一回事),而这通常可以通过某种程度的非规范化设计来实现。

编辑添加: 好的,我忘记提到的另一项更改属于“良好”设计或最佳实践。在您的图片中,price表中有两个 ID 字段,其中一个就足够了。正如@Gilbert Le Blanc 指出的那样id,即使它们位于不同的表中,您也应该尽量避免具有多个字段等不明确的字段名称。这将帮助您查看字段的实用性、识别自然键并消除冗余。

于 2013-07-03T16:04:00.257 回答
0

如果您不会在其他任何地方使用产品和价目表之间的关系,但对于价格,那么另一种设计是这样的:

- 带有字段的表格产品:id,其他

- 带有字段的表价格表:id,其他

- 带有字段的表格价格:id(自动增量)、product_id、pricelist_id、price

并且您将在 product_id、pricelist_id 这对字段上定义索引(不是唯一的)

于 2013-07-03T15:44:52.660 回答