我有一个市场有很多促销的情况。每次促销仅适用于列入白名单的客户。客户有可能被列入多个促销的白名单。而且,由于客户总是输入促销代码以查看其是否合格,因此它必须处理高流量。目前,我实现了一个whitelist_customer表,其中“ customer_id”列具有唯一索引,“ values”列具有text []数组数据类型。例如,在一行中,我可以存储customer_id'1',并且该客户有资格进行3次促销,因此我将'values'与'PROMOCODE1','PROMOCODE2','PROMOCODE3'一起存储。
因此,当customer_id'1'输入代码PROMOCODE2时,它将通过按其customer_id搜索来查询是否合格,然后使用@>(包含)进行搜索。
这种方法是最好的解决方案吗?
答案 0 :(得分:1)
不。 数组违反了数据库设计中的First Normal Form规则(重复值)。 另外,在数组中搜索也需要时间。
最好的解决方案是将每个促销放在不同行的表。该表将具有一个复合主键(这意味着两列上还将有一个索引)
CREATE TABLE customer_promotion (
cust_id int,
promotion varchar(50),
PRIMARY KEY(cust_id, promotion)
);
搜索特定的ust_id和晋升变得微不足道