数据库设计——如何存储以不同方式测量的数量

Database Design - how to store quantities that are measured in different ways

我想知道我为在线食品商店设计的数据库是否符合通常遵循的标准和惯例。

基本上我的困惑是如何存储以不同方式测量数量的物品。

比如有以公斤为单位的商品,也有以包数为单位的商品。

例如,大米以千克为单位,而面条则以包数为单位。

因此 table 计划包含以下字段:

项目 table 具有以下字段:类别、名称、公司、变体和名为 measured_in_packets?..

的布尔变量

对于 measured_in_packets 设置为 true 的项目,另一个 table 中的条目将包含可用的数据包大小:

packet_sizes table 与 item_id 和 packet_size..

因此,如果一种产品有多种包装尺寸(250 克、500 克等),则会根据商品 ID 为每种可用尺寸制作一行...

这听起来像是一个好的数据库设计吗?

简而言之,您拥有具有数量值的项目,但该数量值可以在不同种类的测量类型中测量。你给出了公斤、包装等例子,我们也许可以添加其他例子,比如液体的升等。

当前解决方案的一个问题是不允许任何简单的更改或扩展。它还依赖于检查布尔字段来做出决定(例如,根据您的描述,我相信 table 加入)。

相反,更好的方法是创建一个 table 包含可能的测量类型,例如千克或数据包。然后,您的 items 只需要一个指向此 table 的外键,它会告诉您该项目是如何测量的。这使您可以在将来扩展类型,而无需维护布尔标志或进行任何其他手动工作。

这张图说明了我所指的内容:

因此,如果这些 table 中的数据如下所示:

+----+---------+----------+----------------------+
| id | name    | quantity | measurement_types_id |
+----+---------+----------+----------------------+
|  1 | Rice    |       50 |                    1 |
|  2 | Noodles |       75 |                    2 |
+----+---------+----------+----------------------+

measurement_types

+----+-----------+--------------------+
| id | name      | measurement_symbol |
+----+-----------+--------------------+
|  1 | Kilograms | kg                 |
|  2 | Packets   | packets            |
+----+-----------+--------------------+

使用以下查询的此数据的实际示例:

SELECT items.name, items.quantity, measurement_types.measurement_symbol 
FROM items 
INNER JOIN measurement_types 
    ON measurement_types.id = items.measurement_types_id;

会产生这样的结果:

+---------+----------+--------------------+
| name    | quantity | measurement_symbol |
+---------+----------+--------------------+
| Rice    |       50 | kg                 |
| Noodles |       75 | packets            |
+---------+----------+--------------------+