建议在DB中存储菜单层次结构

时间:2012-12-07 08:28:03

标签: mysql database-design

我有一个食品订购系统,有主要项目,如拿铁,长黑,白色,浓咖啡,美式咖啡等。每个项目存储在DB如下。

* db缺少不必要的列

  +----+----------------+-------------+
  | id | item_name      | price       |
  +----+----------------+-------------+
  | 1  | latte          | 2.0000      |
  +----+----------------+-------------+
  | 2  | long black     | 2.5000      |
  +----+----------------+-------------+
  | 3  | flat white     | 3.0000      |
  +----+----------------+-------------+
  | 4  | americano      | 2.0000      |
  +----+----------------+-------------+

我需要为每个项目添加子选项,但每个项目都有唯一的选项集,例如americano将具有牛奶类型,糖类型。扁平的白色也会有牛奶类型,但需要是不同的菜单,因为americano可能不需要牛奶选项,因此将有不同的子菜单。例如。

   Flat white milk menu 
  +----+----------------+------------+
  | id | item_name      | submenu_id |
  +----+----------------+------------+
  | 1  | soy            |     1      |
  +----+----------------+------------+
  | 2  | rice           |     1      |
  +----+----------------+------------+
  | 3  | regular        |     1      |
  +----+----------------+------------+
  | 4  | trim           |     1      |
  +----+----------------+------------+

   americano milk menu 
  +----+----------------+------------+
  | id | item_name      | submenu_id |
  +----+----------------+------------+
  | 5  | soy            |     2      |
  +----+----------------+------------+
  | 6  | rice           |     2      |
  +----+----------------+------------+
  | 7  | regular        |     2      |
  +----+----------------+------------+
  | 8  | trim           |     2      |
  +----+----------------+------------+
  | 9  | no Milk        |     2      |
  +----+----------------+------------+

然后可能会有一个常见的项目,如糖...

         sugar
  +----+----------------+------------+
  | id | item_name      | submenu_id |
  +----+----------------+------------+
  | 10 | Sugar          |     3      |
  +----+----------------+------------+
  | 11 | no Sugar       |     3      |
  +----+----------------+------------+

将层次结构存储在数据库中的最佳方法是什么?例如,平白将需要值1,3 americano将需要2,3。对于需要更多选项的东西,可能需要相同类型的系统。我需要能够将它们拉出来并使用javascript加载每个子选项。

1 个答案:

答案 0 :(得分:0)

每个子选项是仅属于一个选项还是属于两个选项?我想糖会属于每种选择....

在这种情况下,您将需要三个表:一个选项表,例如您已经拥有(id / name / price),一个子选项表(id / name)和一个连接表(选项/子选项) 。您可以通过添加标志字段来组合选项和子选项表,但在这种情况下,您必须确保正确填充连接表。