设计具有不同列的单个表,以强制实现唯一性

时间:2017-03-17 21:03:16

标签: postgresql

我需要一些关于如何设计此表的建议,以及在表上设置索引以确保查找速度很快。

我有一个包含用户联系人的表格,如:

users_contact
- id
- email
- home_phone
- cell

用户只需输入以下内容之一:email,home_phone,cell。

我需要查询表格,通过电子邮件,home_phone或单元格查找。

  1. 我该如何索引这个表,我想到了3个索引,其中我只有以下索引:

    电子邮件不是空的

    home_phone不是NULL

    cell is NOT NULL

  2. 最好是创建另一个列,例如:“lookup_key”,只需将该值存储在此列中,然后有一个类型列,告诉我该值是什么?

  3. 有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我会尝试第三个选项 - 三个字段合并的索引:

t=# create table users_contact (id bigint, email text, phone text, cell text);
CREATE TABLE
t=# insert into users_contact (email) select '1';
INSERT 0 1
t=# insert into users_contact (email) select '2';
INSERT 0 1
t=# insert into users_contact (cell) select '3';
INSERT 0 1
t=# create index i1 on users_contact (coalesce(email,phone,cell));
CREATE INDEX
t=# with a as (select generate_series(1,10000,1) g) insert into users_contact(phone) select g from a;
INSERT 0 10000
t=# explain select * from users_contact where coalesce(email,phone,cell) = '1';
                                QUERY PLAN
--------------------------------------------------------------------------
 Index Scan using i1 on users_contact  (cost=0.27..8.29 rows=1 width=104)
   Index Cond: (COALESCE(email, phone, cell) = '1'::text)
(2 rows)

t=# explain select * from users_contact where cell = '1';
                           QUERY PLAN
----------------------------------------------------------------
 Seq Scan on users_contact  (cost=0.00..46.69 rows=1 width=104)
   Filter: (cell = '1'::text)
(2 rows)