美食广场订购计划的数据库设计可以更新可用性

时间:2018-12-07 12:10:21

标签: mysql database-design

我正计划制作一个自助点餐亭程序。

这是我计划构建的体系结构。 (数据库服务器是本地服务器,它不在云上。)

Architecture

基本上,我将有一个运行MySQL服务器的本地数据库服务器。 每个食品摊都有一台连接数据库服务器的计算机。每个食品摊位都可以更新其菜单和可用性。例如,每个卖方都可以标记哪个菜单缺货(不可用)。除此之外,当有订单时,可以通知卖方。他下达订单后,可以将订单状态更新为“完成”。 连接到数据库服务器的订购机不止一台。每个买家在下订单时都会插入他们的表号。

这是我当前的数据库设计。

Seller Table
Seller Username (Unique, Primary Key) | Seller Password | Name of the Stall

Menu Table
Menu ID (AutoIncrement, Primary Key) | Food Name | Price | Availability | Seller ID (Foreign Key) //Seller ID is used to indicate who sells the product

Order Table
Order ID (AutoIncrement, Primary Key) | Total Price | Table Number

Order Detail Table
Order ID (Foreign Key) | Food Name | Quantity | Table Number | Seller ID (Foreign Key) | Status //Status is used to determine whether the order has been delivered or not 

编辑

我的问题是:

  • 数据库设计正确吗?
  • 如何避免买家购买不可用的产品?例如,卖方突然改变了汉堡的可用性。但是自订购机进行了查询,以便在自订购机屏幕上显示Burger。有人建议,当买家点击订购时,机器必须首先检查其可用性,但是该怎么做(查询是什么)?
  • 如何立即下订单通知卖家?我的应用程序是否必须每分钟查询一次才能订购明细表?

1 个答案:

答案 0 :(得分:1)

在设计方面,应该在表之间创建更多关系。不要复制信息,而应使用链接到存储信息的表的外键。

具体来说:在订单明细中,用指向 Menu ID 的外键替换 Food Name 字段(来自 Menu < / em>表)。要在下订单时验证产品的可用性,您可以使用使用该关系的触发器,例如:

DELIMITER $$

CREATE TRIGGER check_order_before_insert()
BEFORE INSERT ON order_detail FOR EACH ROW
BEGIN
    IF (SELECT availability FROM menu WHERE menu_id = = NEW.menu_id) = 0
    THEN
        SIGNAL SQLSTATE '45000'
            SET MESSAGE_TEXT = 'Cannot order : product not available';
    END IF;
END;
$$