2009-07-03 8 views
1

Используя MySQL + PHP, я хочу хранить несколько food_item s для одного ресторана order в базе данных MySQL.Несколько элементов в одной строке MySQL?

У меня есть две таблицы: orders & food_items:

Многие food_item_ids будут храниться в течение одного order.

Мне просто интересно, что лучше всего подходит для хранения food_item_id s в order_table?

Должен ли я хранить каждый food_item_id в отдельной строке таблицы orders или разместить все food_item_ids в одном ряду?

ответ

6

Если вы хотите 3NF (и вы не должны до тех пор пока вы найдете производительность является проблемой), вы должны либо:

  • магазин заказ ID в каждой строке таблицы food_item (если food_items это за таблица -порядок);
  • или использовать отношения «многие-ко-многим» (если food_items - это только то, что вы можете заказать).

С первым вариантом, что-то вроде этого будет достаточно:

Orders: 
    order_id 
    other stuff 
FoodItems: 
    order_id 
    item_id 
    other stuff. 

Для второго варианта, отдельная таблица содержит много-ко-многим:

Orders: 
    order_id 
    other stuff 
FoodItems: 
    item_id 
    other stuff. 
FoodItemsInOrder: 
    order_id 
    item_id 
    count 

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

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

2

Если каждый пищевой продукт является уникальным для конкретного заказа, то вы должны хранить идентификатор заказа в таблице food_items, то вы можете запросить так:

SELECT orders.id, food.id 
FROM orders 
INNER JOIN food ON orders.id = food.order_id 

Однако если у вас есть стандартные продукты питания, например, «гамбургер», «чипсы», «хот-дог», тогда вы должны использовать три стола. Один для заказов, один для пищевых продуктов, и один для присоединения к двум:

SELECT orders.id, food.id 
FROM orders 
INNER JOIN orders_food ON orders.id = orders_food.order_id 
INNER JOIN food ON orders_food.food_id = food.id 
Смежные вопросы