Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.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
Postgresql 存储白名单客户的最佳数据库设计_Postgresql_Database Design - Fatal编程技术网

Postgresql 存储白名单客户的最佳数据库设计

Postgresql 存储白名单客户的最佳数据库设计,postgresql,database-design,Postgresql,Database Design,我有一个案例,当一个市场有很多促销活动时。每次促销仅针对白名单客户提供。一位客户很可能因多次促销而被列入白名单。而且它还必须处理高流量,因为客户总是输入促销代码以查看其是否符合条件。目前,我实现了一个白名单_customer表,其中列'customer_id'具有唯一索引,列'values'具有text[]数组数据类型。例如,在一行中,我可以存储客户id“1”,并且该客户符合3次促销的条件,因此我存储带有“PROMOCODE1”、“PROMOCODE2”、“PROMOCODE3”的“值” 因此,

我有一个案例,当一个市场有很多促销活动时。每次促销仅针对白名单客户提供。一位客户很可能因多次促销而被列入白名单。而且它还必须处理高流量,因为客户总是输入促销代码以查看其是否符合条件。目前,我实现了一个白名单_customer表,其中列'customer_id'具有唯一索引,列'values'具有text[]数组数据类型。例如,在一行中,我可以存储客户id“1”,并且该客户符合3次促销的条件,因此我存储带有“PROMOCODE1”、“PROMOCODE2”、“PROMOCODE3”的“值”

因此,当客户id“1”输入代码PROMOCODE2时,它将通过按其客户id搜索来查询资格,然后使用@>(包含)进行搜索

这种方法是最好的解决方案吗?

不是。 数组打破了数据库设计中的规则(重复值)。 此外,在数组中搜索也需要时间

最好的解决方案是使用一个表,其中每个促销都位于不同的行中。此表将有一个复合主键(这意味着两列上也将有一个索引)


搜索特定的客户id和促销变得微不足道

有一种情况是,两次促销也有几乎相同的白名单客户。在我们的案例中,促销活动平均拥有500万客户。因此,如果我们想添加另一个具有相同白名单的促销,它将创建另外500万行。每个月可能会有4-5次新的促销活动。这是最好的方法吗?这两种设计在内存大小方面的差异并不是很大。您需要估计总共有多少行。Pg可以处理一张几亿美元的桌子。如果是更多的话,数组也会很困难,您需要考虑像Apache Casand RayEnEnql解决方案这样的NoSQL解决方案会对这种情况很有帮助。谢谢你的洞察力。我也将坚持复合主键。至于索引,我在postgres中了解到,如果我们为每一列建立单独的索引,而不是为两列建立索引,那么它会更好。
CREATE TABLE customer_promotion (
    cust_id int,
    promotion varchar(50),
    PRIMARY KEY(cust_id, promotion)
);