假设我有一个包含以下列的products
表:
id
(PK)category_id
(FK)color_id
(FK)material_id
(FK)seller_id
(FK)size_id
(FK)name
price
进一步假设可以有0或更多的promotions
应用于产品。促销活动将有开始和结束日期/时间、折扣金额(例如100美元折扣)或百分比(例如10%的折扣)等。
促销只适用于符合一定标准的产品,如:
seller_id
=1和price
>50美元销售的所有产品How我会在数据库中表示这一点吗?我觉得我需要将一个或多个“查询字符串”关联到促销表(例如?color_ids[]=1&sizes[]=3),并根据所有查询字符串测试每个产品,以查看该产品是否是该促销活动的一部分。不过,我认为这是非常低效的。
另一种选择是在系统中插入/更新产品或促销时设置一个表products_promotions
,然后检查该表以查看该产品是否有与其相关的促销活动。
有什么想法?
发布于 2019-03-14 14:53:35
一种方法是将表promotions
创建为:
要确定产品符合的促销条件,您需要动态执行所有查询,并选择sum(discount_amount)
和sum(discount_percentage)
。下面是一个可以帮助您入门的片段:
SET @SQL = CONCAT('SELECT id FROM products WHERE ', @condition, ' INTO @product_id');
PREPARE stmt FROM @SQL;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
您可以将这个片段放入接受condition
并返回product_id
的函数中。
每次SELECT
时运行所有这些查询,product
可能会非常耗时。因此,您可能需要创建一个表product_discounts
,其中包含products
和discounts
的两个外键,以方便这两个表之间的多到多关系。
然后在两个表上使用事件(每天重新计算整个关系)或触发器,或者使用事件和触发器的组合,从product_discounts
中插入和删除行。
我希望这能帮到你。
https://dba.stackexchange.com/questions/232083
复制相似问题