0

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

例如,可能有标准菜单、欢乐时光菜单、特色菜单等,每个菜单都有自己的项目和每个项目的定价。周五上午 10 点至下午 2 点和下午 3 点至下午 5 点,奶酪比萨的价格可能为 10 美元。

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

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

*我需要一个 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    |                |
    +------------------+--------------+------+-----+---------+----------------+

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

    +----------+--------------+------+-----+---------+----------------+
    | 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 列出了菜单的每个单独的菜单项以及用于对类别进行排序的类别(即“饮料”、“食物”、“特价”类别)和“类别索引”。

    +---------------+--------------+------+-----+---------+----------------+
    | 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   |         |
    +----------------+--------------+-----------+-------------+------+---------+
4

1 回答 1

0

我可以看到 4 种方法来做到这一点......

  1. 向 中添加一个time_id字段menu_items,其中包含包含时间的静态数组的 id ... 1=>morning、2=>evening、3=>all-day 等。

  2. 与 #1 相同,但将字段设为可以在 LIKE (%%) 查询中搜索的 VARCHAR ......所以time_id变成类似于“.8.9.10.11”的内容。上午 8 点到 11 点,下午 6 点到 9 点为“.18.19.20.21.”……有点混乱,LIKE 查询更加密集,所以可能并不理想。

  3. 代替 中的字段menu_items,添加另一个表 ... menu_times... 包含menu_item_idtime_ids ... 这可能比 #2 更快。它甚至可以包含一个time_description而不是time_id,例如“all morning”或“happy hour”。

  4. 你可以在和...menu_times之间放置...如此包含,其中包含。menusmenu_itemsmenusmenu_timesmenu_items

关于所有这些解决方案需要注意的一点是,其中一些解决方案需要多个menu_items不同价格的解决方案……这并不理想。但是,对于解决方案 1-3,您可以通过将 移动pricemenu_times表中来解决此问题。

于 2012-10-06T06:31:56.267 回答