包含产品、属性和价格的数据库设计

Database Design with products, attributes and prices

获得具有多个价格且价格同时取决于其属性的产品的最佳方法是什么?我想储存橙汁(小)10 美元和橙汁(大)14 美元。我应该如何管理这些记录?这是我的解决方法。

**products**
----------
id    name
1     orange juice

**prices**
----------
id    product_id    price
1     1             10
2     1             14

**sizes**
----------
id    product_id    size
1     1             small
2     1             large

**prices_sizes**
----------
id    price_id    size_id
1     1           1
2     2           2

或者我应该有类似 products_prices_sizes 的东西吗?

类似这样:每个产品和每个尺码都有一个 ID,价格 table 为一对分配一个价格 (product_id, size_id)

**products**
----------
id    name
1     orange juice

**sizes**
----------
id      size
1       small
2       large

**prices**
----------
id    product_id    size_id     price
1     1             1           10
2     1             2           14

是的,你应该 "have something like products_prices_sizes"。没有理由不这样做。你给出的设计是编码(产品价格,尺寸)三元组作为成对的冗余对,((产品价格),(产品尺寸))。也不清楚为什么你使用 ids 作为对。

最直接最简单的设计是:

-- "product PRODUCT in size SIZE has price PRICE"
Product(product, size, price)

要查看您是否应该将其分解为更小的 tables(连接回它),您需要了解 规范化 。碰巧在这种情况下,根据我们对您的应用程序的常识理解,{name, size} 是唯一的 候选键 而 table 在 5NF 中,不应该分解成更简单的 tables。仅仅因为每个名称-大小对只有一个价格,并不意味着您必须具有二元关系。而且我不知道你为什么提出一对。

您可能需要产品 ID。您可能需要尺寸 ID。您极不可能想要价格 ID。但是你应该有一个 理由 使用 ID 来代替 "natural keys" 或者除了 "natural keys"。 (而且是有原因的。)(你应该学习它们。)但这与是否应该有三向关系无关。