2011-01-26 40 views
10


Gấu với tôi, im thực sự tồi tệ tại giải thích điều và tôi dont thậm chí biết một tiêu đề thích hợp cho vấn đề này
Ok guys tôi có vấn đề này
Tôi đã có một bảng tên mealMysql, tàng trữ nhiều giá trị trong cột duy nhất từ ​​một bảng

+------+--------+-----------+---------+ 
| 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 bây giờ tôi muốn cho phép quản trị viên để tạo ra một bữa ăn kết hợp từ meal bảng này
Vì vậy, đó có nghĩa là, một bữa ăn kết hợp có thể có amout không giới hạn số bữa ăn

01.

Hiện nay im câu đố như thế nào để lưu trữ/link kết hợp bữa ăn để bữa ăn tôi donw muốn lưu trữ một cái gì đó lke dưới

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

Nhìn vào cột meal_id, tôi không nghĩ rằng đó là một cách tốt để lưu trữ dữ liệu

Trả lời

19

Tạo một bảng liên kết nhiều-nhiều:

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 

để chọn tất cả các bữa ăn cho một combo đưa ra:

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

Đây là cách phù hợp để làm điều đó –

+0

thanx bốn câu trả lời – slier

+0

Trong khi truy xuất dữ liệu, điều này sẽ mất nhiều chu kỳ hơn để xử lý so với cấu trúc của người hỏi nơi người ta có thể xử lý chuỗi đó để nhận nhiều giá trị. Tôi cũng bối rối trong chuyện này! –

4

No. Chắc chắn đây không phải là cách hay để lưu trữ dữ liệu. Bạn sẽ tốt hơn với một bảng combo_header và một bảng combo_details.

combo_header sẽ được giống như:

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

Và sau đó, combo_details sẽ được giống như:

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

Bằng cách này, bằng cách sử dụng nhiều giá trị trong một cột duy nhất bạn đang vi phạm đầu tiên bình thường hình thức cơ sở dữ liệu quan hệ.

Cách tôi đang đề xuất sẽ cho phép bạn trả lời các truy vấn như nhận tất cả tên của các bữa ăn của combo1 rất dễ giải quyết.

1

Đây được gọi là mối quan hệ nhiều-nhiều giữa các bữa ăn và combo. Một bữa ăn có thể được liệt kê trong nhiều combo và một combo có thể chứa nhiều bữa ăn. Bạn sẽ cần một bảng liên kết (thay vì trường combo.meal_id) chứa tất cả các cặp bữa ăn có thể có.

Cuối cùng, bạn sẽ có ba bảng:

  1. bữa ăn (meal_id, phục vụ, tên)
  2. combo (combo_id, phục vụ, tên)
  3. meal_combo (AutoID, meal_id, combo_id)

meal_combo.autoid không thật sự cần thiết, nó chỉ là một khuyến nghị chung.

Để liệt kê một combo với tất cả các bữa ăn của nó trong nó:

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 cho 'nhiều-nhiều mối quan hệ' hoặc 'cơ sở dữ liệu liên kết bảng' để biết chi tiết.

+0

Cá nhân tôi cảm thấy sức mạnh vô hạn trí tuệ khi sử dụng nó lần đầu tiên như một cậu bé ... –

+0

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

Các vấn đề liên quan