2011-01-26 3 views
10


медведя со мной, им очень плохо объясняя вещь и я даже не знаю, подходящее название для этой проблемы
Ok ребят У меня эта проблема
У меня уже есть одна таблица имя mealMysql, хранение несколько значения в одной колонке из другой таблицы

+------+--------+-----------+---------+ 
| 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 таблицы
Так что средний, комбинированный прием пищи может иметь неограниченное число amout еды

В настоящее время им головоломка, как сохранить/ссылку комбо еду к еде я donw хочу сохранить что-то 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 колонке, я не думаю, что это хороший способ для хранения данных

ответ

19

Создать много-ко-многим ссылка таблицы:

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

Это правильный способ сделать это –

+0

thanx four answer – slier

+0

При извлечении данных не требуется больше циклов для обработки по сравнению с структурой аскер, где можно обрабатывать эту строку для получения нескольких значений. Я тоже в этом смущен! –

4

Нет. Это определенно не очень хороший способ хранения данных. Вам будет лучше с таблицей 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 очень легко решить.

1

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

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

  1. еду (meal_id, обслуживание, имя)
  2. комбо (combo_id, служащий, имя)
  3. meal_combo (AutoID, meal_id, combo_id)

food_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 для «многие-ко-многим» или «базы данных ссылок таблицы» для подробной информации.

+0

Я лично ощущал Бесконечную Силу Мудрости, когда использовал ее в первый раз как мальчик ... –

+0

http://explainextended.com/2009/06/21/click/ – Quassnoi

Смежные вопросы