2013-01-24 36 views
2

我需要創建一個表(postgresql 9.1),我卡住了。你能幫忙嗎?postgreSQL表設計

輸入數據可以假定或者兩種格式:

  1. 客戶端ID(INT),店鋪ID(INT),ASOF(日期),數量
  2. 客戶端ID(INT),ASOF (日期),數量

給定傳入CSV模板:{客戶端ID,店鋪ID,店鋪類型,商店類型,ASOF,數量}

在第一種情況,關鍵是 - 客戶ID,商店ID,asof

在第二種情況下,關鍵是 - 客戶端ID,商店類型,商店流派,ASOF

我想是這樣的:

create table(
      client_id  int references..., 
      shop_id   int references..., 
      shop_type  int references..., 
      shop_genre  varchar(30), 
      asof   date, 
      quantity  real, 
      primary key(client_id, shop_id, shop_type, shop_genre, asof) 
    ); 

但後來我遇到了一個問題。當數據格式爲1時,由於pk中的空值,插入失敗。

客戶端中的查詢可以是商店ID,也可以是商店類型和流派的組合。類型的部分或正則表達式匹配沒有用例。

什麼是合適的設計?我必須將它分成2個表格,然後將搜索結果聯合起來?或者,習慣上將0和空白作爲缺失值並移動?

如果重要,一旦載入所有歷史數據,該表預計將有1億到5億行。

謝謝。

回答

3

您可以嘗試部分唯一索引,也稱爲過濾唯一索引,即條件唯一索引。 http://www.postgresql.org/docs/9.2/static/indexes-partial.html

基本上它歸結爲是基於where子句過濾唯一性,

例如(當然測試的正確性和衝擊性能)的內容:

CREATE TABLE client(
      pk_id   SERIAL, 
      client_id  int, 
      shop_id   int, 
      shop_type  int, 
      shop_genre  varchar(30), 
      asof   date, 
      quantity  real, 
      PRIMARY KEY (pk_id) 
    ); 


    CREATE UNIQUE INDEX uidx1_client 
    ON client 
    USING btree 
    (client_id, shop_id, asof, quantity) 
    WHERE client_id = 200; 

    CREATE UNIQUE INDEX uidx2_client 
    ON client 
    USING btree 
    (client_id, asof, quantity) 
    WHERE client_id = 500; 
+0

這是一個很好的解決方案...-D-D –

+0

謝謝。我認爲這應該可以解決我的問題。 – Dinesh

1

一個簡單的解決方案是創建一個領域,其將使用兩種算法一個取決於什麼是在通過時其數據的主鍵。

如果你想要一個完全標準化的解決方案,你大概會需要將商店信息分成兩個單獨的表格,並使用外部連接從該表格引用它。

您可能也可以使用postgres中提供的表繼承。

+0

這是一個我已經看到和運作的選項。基本上你採用了與部分唯一索引相同的方法,但是使用觸發器來強制執行where邏輯。見http://stackoverflow.com/questions/8250389/computed-calculated-columns-in-postgresql如果生成的主鍵變得難看,你可以考慮使用它並使用一些滿足需求的算法對它進行哈希處理,然後將其填充到柱。仍然看起來有點醜,但至少看起來不像弗蘭肯斯坦。 – Kuberchaun

+0

我可以看到如何使用這種方法,但我喜歡單個自動生成PK的想法,因爲它與我的其餘表格更好地點擊。另外,這是一個使用繼承的場景嗎?就像一個表格預測{client_id,asof},然後兩個表格,一個forecast_by_shop_id(shop_id)繼承(預測),另一個預測爲forecast_by_genre(shop_type,shop_genre)繼承(預測)?我之前沒有在數據庫中使用過繼承功能。謝謝。 – Dinesh

+0

我從來沒有使用表繼承。但是,我認爲它可以爲您提供一個解決方案,它爲您提供兩組不同的主鍵,並防止創建不符合這兩個要求的數據。 –