2017-03-17 57 views
0

我需要一些關於如何設計此表的建議,以及在表上設置索引以確保查找速度快。使用強制唯一性的不同列設計單個表

我有一個包含如用戶接觸的表:

users_contact 
- id 
- email 
- home_phone 
- cell 

用戶只需要輸入的1:電子郵件,HOME_PHONE,細胞。

我將需要查詢表,查找電子郵件,home_phone或單元格。

  1. 我應該怎樣索引這個表,我想的是3個指標,在這裏我只索引時:

    電子郵件NOT NULL

    HOME_PHONE是NOT NULL

    細胞是NOT NULL

  2. 創建另一個列如「lookup_key」,並將該值存儲在此列中,然後有一個類型col這個告訴我什麼是價值?

有什麼建議嗎?

+0

我會去第三種選擇 - 基於函數的索引,而不是 - 如果你用在當你選擇索引將被消耗相同。 –

+0

添加另一列,它是由BEFORE INSERT和BEFORE UPDATE觸發器填充的電子郵件,home_phone和單元格的連接。索引它,需要NOT NULL並用於查找。 – iTollu

+0

@iTollu我討厭觸發器:) – Blankman

回答

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) 
+0

和這工作正常,如果有人輸入電子郵件和電話?即多個列值。電子郵件,home_phone,cell都必須是唯一的。 – Blankman

+0

coalesce首先返回非空參數。所以如果你有一些優先權,它會起作用。但我建議它認爲你將只有三個值...你的兩個解決方案需要額外的邏輯與幾個值btw –

相關問題