数据库设计,可更新菜场点菜程序的可用性

13z8s7eq  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(260)

我打算做一个自助点菜(kiosk)的美食法庭计划。
这就是我计划构建的体系结构(数据库服务器是本地服务器,不在云上)。

基本上,我将有一个运行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

编辑
我的问题是:
数据库设计正确吗?
我怎样才能避免买家购买一个没有货的产品?例如,突然卖家改变了汉堡的供应。但是自助点菜机已经进行了查询,所以汉堡会显示在自助点菜机屏幕上。有人建议,当买家点击订购时,机器必须先检查是否有货,但如何做到这一点(什么是查询)?
有订单时如何立即通知卖方?我的应用程序是否必须每分钟进行一次查询才能订购明细表?

ctzwtxfj

ctzwtxfj1#

在设计方面,您应该在表之间创建更多的关系。不要复制信息,而是使用链接到存储信息的表的外键。
具体来说:在order detail中,将fieldfood name替换为menu id的外键(来自menu table)。要在下订单时验证产品可用性,可以使用使用该关系的触发器,如:

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;
$$

相关问题