2011-01-26 25 views
10


pokrywa się ze mną, im naprawdę źle wyjaśniając rzeczy, a ja nawet nie wiem odpowiedni tytuł dla tego problemu
Ok chłopaki mam ten problem
już mam jedna tabela nazwa mealMysql, przechowywanie wielu wartości w jednej kolumnie z innej tabeli

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

Ok teraz chcę pozwalają administratorowi na tworzenie posiłek combo z tym meal tabeli
tak, że średnio, posiłek kombi może mieć nieograniczona amout mączki

Obecnie im puzzle jak przechowywać/link combo posiłek posiłku I donw chcesz zapisać coś robiła poniżej

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

spójrz na kolumnę meal_id, nie sądzę, że to dobry sposób na przechowywanie danych

Odpowiedz

19

utworzyć wiele-do-wielu łącza tabeli:

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 

aby zaznaczyć wszystkie posiłki dla danej kombi:

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

To jest właściwa droga, aby to zrobić. –

+0

thanx four answer – slier

+0

Podczas pobierania danych nie trzeba wykonywać więcej cykli w porównaniu do struktury pytającego, w której można przetworzyć ten ciąg, aby uzyskać wiele wartości. Jestem w tym także zdezorientowany! –

4

Nie. Z pewnością nie jest to dobry sposób na przechowywanie danych. Będziesz lepiej z tabelą combo_header i tabelą .

combo_header będzie coś takiego:

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

a następnie combo_details będzie coś podobnego:

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

Nawiasem mówiąc, przy użyciu wielu wartości w jednej kolumnie jesteś naruszono pierwszy normalny forma relacyjnych baz danych.

Proponowany przeze mnie sposób pozwoli Ci odpowiedzieć na pytania takie jak: , dzięki czemu wszystkie nazwy posiłków combo1 będą bardzo łatwe do rozwiązania.

1

Jest to tak zwana relacja wiele do wielu między posiłkami i kombinacją. Posiłek może być wymieniony w wielu kombinacjach, a combo może zawierać wiele posiłków. Będziesz potrzebował tabeli linków (zamiast pola combo.meal_id), która zawiera wszystkie możliwe pary kombi.

w końcu trzeba będzie trzy tabele:

  1. posiłek (meal_id, służąc, nazwa)
  2. combo (combo_id, służąc, nazwa)
  3. meal_combo (AutoID, meal_id, combo_id)

meal_combo.autoid nie jest ściśle potrzebny, to tylko ogólna rekomendacja.

Do listy combo ze wszystkimi posiłkami To w nim:

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 za „wiele do wielu relacji” lub „” tabeli bazy danych łącza o szczegóły.

+0

Osobiście poczułem Nieskończoną Mądrość Mocy, gdy użyłem jej po raz pierwszy jako chłopiec ... –

+0

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

Powiązane problemy