我想知道根据通常遵循的标准和惯例,我在网上食品店的数据库设计是否合适。
基本上我的困惑是如何存储以不同方式测量数量的物品。
例如,有些项目以千克为单位进行测量,然后根据数据包数量测量项目。
例如米饭以千克为单位测量,例如,面条将以包的数量来衡量。
所以表格计划在以下字段中:
包含字段的项目表:category,name,company,variant和名为measured_in_packets的布尔变量?..
对于measured_in_packets设置为true的项目,另一个表中的条目将保留可用的数据包大小:
包含item_id和packet_size的packet_sizes表..
因此,如果一个产品有多个数据包大小(250 gm,500 gm等),则每个可用大小的行将针对项目ID ...
这听起来像是一个很好的数据库设计吗?
答案 0 :(得分:3)
简而言之,您拥有具有数量值的物品,但该数量值可以在不同类型的测量类型中测量。你给出了公斤,包装等例子,我们也许可以添加其他产品,如液体升等等。
当前解决方案的一个问题是不允许任何容易的改变或扩展。它还依赖于检查布尔字段以便做出决定(例如,根据您的描述,我相信要加入哪个表)。
相反,更好的方法是创建一个包含可能的测量类型的表,例如千克或数据包。然后你的items
只有一个外键到这个表,并告诉你如何测量项目。这允许您将来扩展类型,不需要维护布尔标志,也不需要做任何其他手动工作。
此图说明了我所指的内容:
因此,如果这些表中的数据如下所示:
<强>项
+----+---------+----------+----------------------+
| 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 |
+---------+----------+--------------------+