Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在促销的FK user_id上添加唯一约束是否会阻止用户两次申请促销?_Sql_Ruby On Rails_Postgresql - Fatal编程技术网

Sql 在促销的FK user_id上添加唯一约束是否会阻止用户两次申请促销?

Sql 在促销的FK user_id上添加唯一约束是否会阻止用户两次申请促销?,sql,ruby-on-rails,postgresql,Sql,Ruby On Rails,Postgresql,我试图实现一个用例,当为电子商务应用程序创建促销时,用户只能申请一次促销。因此,如果有一个特价10美元的购买,或类似的东西,用户只能声称促销一次,现在和永远 以下是我的想法: promotions ---------- id | int start | datetime end | datetime claimed | boolean user_id | int product_id | int 基本上,如果我向user_id外键添加一个唯一的约束,该约束将阻止用户在正确后声明升级?唯一

我试图实现一个用例,当为电子商务应用程序创建促销时,用户只能申请一次促销。因此,如果有一个特价10美元的购买,或类似的东西,用户只能声称促销一次,现在和永远

以下是我的想法:

promotions

----------
id  | int
start | datetime
end  | datetime
claimed | boolean
user_id | int
product_id | int

基本上,如果我向user_id外键添加一个唯一的约束,该约束将阻止用户在正确后声明升级?唯一的问题是如果我在第二天或一周后升职怎么办?这对promotions表来说并不重要,因为按照现在的设置方式,用户只能永远有一次促销,而无法获得另一次促销。我的假设正确吗?如果我是,我如何应对这种情况?

您不应该在促销表中存储指向用户的链接。使用链接表从促销中拆分用户:

用户请求推进动作

在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)
);
由于两列上的唯一约束,现在单个用户不可能两次申请升级,但他仍然可以申请多个升级


这样,您的促销数据也不会重复,就像您原来的方法一样。

您希望这样吗?嘿@juergend谢谢您的回复。我现在是个糊涂虫,但我很确定我绝对不想这样,因为正如我所说的,我将来会想做更多的促销活动。你有什么建议吗。我真的需要帮助。谢谢。我正在考虑一个检查约束,并在表中添加一个过期字段。也许我可以做一些逻辑来删除声明后的促销。如果促销是针对特定产品的,那么你可以在用户id、产品id上添加一个唯一的密钥,这是一个很好的观点。这将解决特定产品的折扣问题。谢谢,我想我的车轮又开始转动了。你可以从开始日期和/或结束日期提取日期部分日、月、年,然后用它、用户id和声明列创建唯一索引。