设计数据库以允许基于时间的食物菜单

时间:2012-10-06 06:18:30

标签: mysql database data-structures time

我正在尝试构建一个系统,允许餐馆创建可根据一天中的时间和星期几显示的菜单。

例如,可能有标准菜单,欢乐时光菜单,特价菜单等,每个菜单都有自己的项目和每个项目的定价。芝士披萨在周五上午10点到下午2点可以是10美元,下午5点到下午5点也是5美元。

设计数据库的好方法是什么,以便项目可以有不同的定价(基于一天中的时间和星期几),以及与各种“菜单”相关联(以便对它们进行分类)?

我目前的系统实际上并不允许这样做(因为当时不需要基于时间的菜单)。

*我需要一个menu_items_times表,其中包含价格,时间开始,时间结束的列吗?*

场地表 - 每个单独的限制(primary_menu_id)与菜单表中的menu_id相关

    +------------------+--------------+------+-----+---------+----------------+
    | Field            | Type         | Null | Key | Default | Extra          |
    +------------------+--------------+------+-----+---------+----------------+
    | venue_id         | bigint(20)   | NO   | PRI | None    | auto_increment |
    | name             | varchar(256) | NO   |     | None    |                |
    | primary_menu_id  | bigint(20)   | NO   |     | NULL    |                |
    +------------------+--------------+------+-----+---------+----------------+

菜单表每个菜单及其所属的地点

    +----------+--------------+------+-----+---------+----------------+
    | Field    | Type         | Null | Key | Default | Extra          |
    +----------+--------------+------+-----+---------+----------------+
    | menu_id  | bigint(20)   | NO   | PRI | None    | auto_increment |
    | venue_id | bigint(20)   | NO   |     | None    |  
    | name     | varchar(256) | NO   |     | None    |                |
    +----------+--------------+------+-----+---------+----------------+

menu_items表菜单的每个菜单项以及用于对类别进行排序的类别(即“饮品”,“食品”,“特价”类别)和“category_index”。

    +---------------+--------------+------+-----+---------+----------------+
    | Field         | Type         | Null | Key | Default | Extra          |
    +---------------+--------------+------+-----+---------+----------------+
    | menu_item_id  | bigint(20)   | NO   | PRI | none    | auto_increment |
    | menu_id       | bigint(20)   | NO   |     | none    |                |
    | name          | varchar(256) | NO   |     | none    |                |
    | price         | float        | NO   |     | none    |                |
    | category      | varchar(64)  | NO   |     | none    |                |
    | category_index| int(11)      | NO   |     | none    |                |
    +---------------+--------------+------+-----+---------+----------------+

menu_items_categories视图

    +----------------+--------------+-----------+-------------+------+---------+
    | Field          | Type         | Collation |  Attributes | NULL | Extra   |
    +----------------+--------------+-----------+-------------+------+---------+
    | menu_id        | bigint(20)   |           |             | No   |         |
    | category       | varchar(64)  |           |             | No   |         |
    | category_index | int(11)      |           |             | No   |         |
    +----------------+--------------+-----------+-------------+------+---------+

1 个答案:

答案 0 :(得分:0)

我可以看到4种方法......

  1. time_id添加menu_items字段,其中包含包含时间的静态数组的ID ... 1 => morning,2 => evening,3 => ;全天等。

  2. 与#1相同,但使字段成为可以在LIKE(%%)查询中搜索的VARCHAR ...因此time_id变为“.8.9.10.11”。上午8点到11点,'。18.19.20.21。“下午6点到9点......比较麻烦,LIKE查询更加密集,所以可能不太理想。

  3. 而不是menu_items中的字段,添加另一个表格menu_times ...包含menu_item_idtime_id s ...这可能比#2快。它甚至可以包含time_description而不是time_id,例如“所有早晨”或“欢乐时光”。

  4. 您可以将menu_times放在menusmenu_items之间......所以menus包含menu_times,其中包含menu_items

  5. 有关所有这些解决方案的一点需要注意的是,其中一些解决方案需要多个menu_items以获得不同的价格......这并不理想。但是,使用解决方案1-3,您可以通过将price移动到menu_times表中来解决此问题。