我正在尝试实现一个用例,当为电子商务应用程序创建促销时,用户只能申请一次促销。因此,如果有一个特价10美元的购买,或类似的东西,用户只能现在和永远声称该促销。
下面是我的想法:
promotions
----------
id | int
start | datetime
end | datetime
claimed | boolean
user_id | int
product_id | int基本上,如果我向user_id外键添加一个UNIQUE约束,一旦正确,就会阻止用户声明提升?唯一的问题是,如果我第二天或一周后升职怎么办?这对promotions表来说无关紧要,因为按照现在的设置方式,用户只能永远拥有一个促销,而不能获得另一个促销。我的假设正确吗?如果我是,我该如何应对呢?
发布于 2019-09-06 15:31:38
您不应将指向用户的链接存储在promotions表中。使用链接表将用户从促销中分离出来:
用户<--M..M --> ClaimedPromotions <-- M..M -->促销
在ClaimedPromotions表中,您应该使用唯一约束来存储指向用户和促销的链接:
CREATE TABLE ClaimedPromotions
(
user_id integer not null references Users(id),
promotion_id integer not null references Promotions(id),
UNIQUE (user_id, promotion_id)
);由于两个列上的唯一约束,现在单个用户不可能声明两次促销,但他仍然可以声明多个促销。
通过这种方式,您也不会像在原始方法中那样,在促销数据上存在重复。
https://stackoverflow.com/questions/57816925
复制相似问题