Mysql, сохраняя несколько значений в одном столбце из другой таблицы


Потерпите меня, я очень плохо разбираюсь в этом, и я даже не знаю подходящего названия для этой проблемы
Хорошо, ребята, у меня есть эта проблема
У меня уже есть одно имя таблицы 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   |
+------+--------+-----------+---------+

Хорошо теперь я хочу разрешить администратору создавать комбо-питание из этой таблицы meal
Таким образом, это означает, что комбинированная еда может иметь неограниченное количество еды

В настоящее время головоломка, как хранить/связывать комбинированную еду с едой Я не хочу хранить что-то lke ниже

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

Посмотрите на столбец meal_id, я не думаю, что это хороший способ хранения данных

Ответ 1

Создайте таблицу ссылок "многие-ко-многим":

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

Чтобы выбрать все блюда для данного комбо:

SELECT  m.*
FROM    combo_meal cm
JOIN    meal m
ON      m.id = cm.meal_id
WHERE   cm.combo_id = 1

Ответ 2

Нет. Это определенно не хороший способ хранения данных. Вам будет лучше с таблицей combo_header и таблицей combo_details.

combo_header будет выглядеть примерно так:

+------+--------------+-----------+
|  id  |  combo_name  | serving   |
+------+--------------+-----------+
|  1   |   combo1     |  2 person |
+------+--------------+-----------+
|  2   |   combo2     |  2 person |
+------+--------------+-----------+
|  4   |   combo3     |  2 person |
+------+--------------+-----------+

И тогда combo_details будет выглядеть примерно так:

+------+-----------+
|  id  |  meal_id  |
+------+-----------+
|  1   |  1        |
+------+-----------+
|  1   |  4        |
+------+-----------+
|  1   |  7        |
+------+-----------+
|  1   |  9        |
+------+-----------+
... / you get the idea!

Кстати, используя несколько значений в одном столбце, вы нарушаете первую нормальную форму реляционных баз данных.

Способ, который я предлагаю, позволит вам отвечать на запросы, как получить все названия блюд combo1 очень легко решить.

Ответ 3

Это называется отношением "многие ко многим" между приемами пищи и комбо. Еда может быть перечислена в нескольких комбо, а комбо может содержать несколько приемов пищи. Вам понадобится таблица ссылок (вместо поля combo.meal_id), которая содержит все возможные парные комбинации еды.

В конце концов, у вас будет три таблицы:

  • еда (еда, подача, имя)
  • комбо (combo_id, обслуживание, имя)
  • meal_combo (autoid, meal_id, combo_id)

meal_combo.autoid не является строго необходимым, это всего лишь общая рекомендация.

Перечислить комбо со всеми его приемами в нем:

SELECT meal.id, meal.name FROM comboINNER JOIN meal_combo ON meal_combo.combo_id = combo.id INNER JOIN meal ON meal.id = meal_combo.meal_id WHERE combo.id = 132

Google для связи "многие-ко-многим" или "таблицы ссылок базы данных" для деталей.