单个MySQL行中的多个项目?

时间:2009-07-03 09:45:09

标签: php mysql

使用MySQL + PHP,我想在MySQL数据库中为单个餐馆food_item存储几个order

我有两张桌子:orders& food_items

将为单个food_item_ids存储多个order

我只是想知道,将food_item_id存储在orders_table中的最佳方法是什么?

我应该将每个food_item_id存储在orders表格的单独一行中,还是将所有特定订单的food_item_ids放入一行?

2 个答案:

答案 0 :(得分: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

在我看来,所有数据库表应该以第三范式设计。一旦你的表变得如此之大以至于性能可能成为一个问题(它必须非常大),那么你就可以开始考虑对速度进行去标准化。

对于一家餐馆来说,我无法想象订单和食品项目表的大小足以保证去标准化。

答案 1 :(得分:2)

如果每个食品对特定订单都是唯一的,那么您应该将订单ID存储在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