Mysql,在另一个表的单列中存储多个值

sli*_*ier 10 mysql database-design


忍受我,我真的很难解释的事情,我甚至不知道这个问题的合适的标题
好的家伙我有这个问题
我已经有一个表名meal

+------+--------+-----------+---------+
|  id  |  name  | serving   |  price  |
+------+--------+-----------+---------+
|  1   | soup1  |  2 person |  12.50  |
+------+--------+-----------+---------+
|  2   | soup2  |  2 person |  15.50  |
+------+--------+-----------+---------+
|  3   | soup3  |  2 person |  23.00  |
+------+--------+-----------+---------+
|  4   | drink1 |  2 person |  4.50   |
+------+--------+-----------+---------+
|  5   | drink2 |  2 person |  3.50   |
+------+--------+-----------+---------+
|  6   | drink3 |  2 person |  5.50   |
+------+--------+-----------+---------+
|  7   | frui1  |  2 person |  3.00   |
+------+--------+-----------+---------+
|  8   | fruit2 |  2 person |  3.50   |
+------+--------+-----------+---------+
|  9   | fruit3 |  2 person |  4.50   |
+------+--------+-----------+---------+
Run Code Online (Sandbox Code Playgroud)

好吧,现在我想让管理员从这张meal桌子创建一个组合餐
这样的意思是,一个组合餐可以有无限数量的餐

目前即兴谜题如何存储/链接组合餐到我不想存储下面的东西

+------+--------------+-----------+-----------+
|  id  |  combo_name  | serving   |  meal_id  |
+------+--------------+-----------+-----------+
|  1   |   combo1     |  2 person |   1,4,7,9 |
+------+--------------+-----------+-----------+
|  2   |   combo2     |  2 person |   2,5,8   |
+------+--------------+-----------+-----------+
|  4   |   combo3     |  2 person |   3,5,6,9 |
+------+--------------+-----------+-----------+
Run Code Online (Sandbox Code Playgroud)

看看meal_id专栏,我不认为这是存储数据的好方法

Qua*_*noi 22

创建多对多链接表:

combo_id    meal_id
1           1
1           4
1           7
1           9
2           2
2           5
2           8
3           3
3           5
3           6
3           9
Run Code Online (Sandbox Code Playgroud)

选择给定组合的所有餐点:

SELECT  m.*
FROM    combo_meal cm
JOIN    meal m
ON      m.id = cm.meal_id
WHERE   cm.combo_id = 1
Run Code Online (Sandbox Code Playgroud)


Pab*_*ruz 5

不,这绝对不是存储数据的好方法。combo_header一张桌子,一张桌子,你会更好combo_details

combo_header会是这样的:

+------+--------------+-----------+
|  id  |  combo_name  | serving   |
+------+--------------+-----------+
|  1   |   combo1     |  2 person |
+------+--------------+-----------+
|  2   |   combo2     |  2 person |
+------+--------------+-----------+
|  4   |   combo3     |  2 person |
+------+--------------+-----------+
Run Code Online (Sandbox Code Playgroud)

然后,combo_details会是这样的:

+------+-----------+
|  id  |  meal_id  |
+------+-----------+
|  1   |  1        |
+------+-----------+
|  1   |  4        |
+------+-----------+
|  1   |  7        |
+------+-----------+
|  1   |  9        |
+------+-----------+
... / you get the idea!
Run Code Online (Sandbox Code Playgroud)

顺便说一句,通过在单个列中使用多个值,您违反了关系数据库的第一范式。

我建议的方式将让您回答查询,例如获取组合 1 的所有餐点名称,非常容易解决。