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

时间:2015-01-06 18:51:22

标签: database database-design

我想知道根据通常遵循的标准和惯例,我在网上食品店的数据库设计是否合适。

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

例如,有些项目以千克为单位进行测量,然后根据数据包数量测量项目。

例如米饭以千克为单位测量,例如,面条将以包的数量来衡量。

所以表格计划在以下字段中:

包含字段的项目表:category,name,company,variant和名为measured_in_packets的布尔变量?..

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

包含item_id和packet_size的packet_sizes表..

因此,如果一个产品有多个数据包大小(250 gm,500 gm等),则每个可用大小的行将针对项目ID ...

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

1 个答案:

答案 0 :(得分:3)

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

当前解决方案的一个问题是不允许任何容易的改变或扩展。它还依赖于检查布尔字段以便做出决定(例如,根据您的描述,我相信要加入哪个表)。

相反,更好的方法是创建一个包含可能的测量类型的表,例如千克或数据包。然后你的items只有一个外键到这个表,并告诉你如何测量项目。这允许您将来扩展类型,不需要维护布尔标志,也不需要做任何其他手动工作。

此图说明了我所指的内容:

enter image description here

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

<强>项

+----+---------+----------+----------------------+
| 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            |
+---------+----------+--------------------+