2009-07-03 15 views
1

Mit MySQL + PHP möchte ich mehrere food_item s für ein einzelnes Restaurant order in einer MySQL-Datenbank speichern.Mehrere Elemente in einer einzelnen MySQL-Zeile?

Ich habe zwei Tabellen: orders & food_items:

Viele food_item_ids wird für ein einzelnes order gespeichert werden.

Ich frage mich nur, was ist der beste Ansatz zum Speichern der food_item_id s in der Orders_Table?

Sollte ich jede food_item_id in einer separaten Zeile der orders Tabelle speichern, oder alle food_item_ids eines bestimmten Auftrags in eine einzelne Zeile setzen?

Antwort

6

Wenn Sie 3NF wollen (und Sie sollten, es sei denn und bis Sie die Leistung ein Problem ist), sollten Sie entweder:

  • speichern die ID, um in jeder Zeile der food_item Tabelle (wenn food_items a pro Bestell-Tabelle);
  • oder verwenden Sie eine Viele-zu-Viele-Beziehung (wenn food_items nur die möglichen Dinge sind, die Sie bestellen können).

Mit der ersten Option, wie etwas, das würde genügen:

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

Für die zweite Option, eine separate Tabelle enthält die many-to-many-Beziehung:

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

In meinem Meinung, alle Datenbanktabellen sollten in der dritten Normalform entworfen werden. Sobald der Tisch so groß wird, dass die Leistung ein Problem werden kann (und es muss sehr groß sein), dann können Sie anfangen, über die Normalisierung der Geschwindigkeit zu denken.

Für ein Restaurant kann ich mir nicht vorstellen, dass die Reihenfolge und die Tische für Essensgegenstände annähernd groß genug sind, um eine Entnormalisierung zu rechtfertigen.

2

Wenn jedes Nahrungsmittel einzigartig in einer bestimmten Reihenfolge ist, dann sollten Sie die Bestell-ID in der food_items Tabelle speichern, dann könnten Sie wie folgt abfragen:

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

Allerdings, wenn Sie Standard-Lebensmittel haben, z.B. "Burger", "Chips", "Hot Dog" dann sollten Sie drei Tabellen verwenden. Eine für Bestellungen, eine für Lebensmittel und eine, um die beiden zu verbinden:

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 
Verwandte Themen