Postgresql

數據倉庫——生成用於 WHERE 子句的自然鍵

  • August 19, 2016

我需要根據多個 where 條件從數據倉庫事實表中重複檢索一組記錄。

不是

WHERE (user_d=1 OR user_id=2) AND (branch_id=1 OR branch_id=2)

WHERE (user_id=1 AND branch_id=1) OR (branch_id=2 AND branch_id=2)

我正在考慮做這樣的事情:

... WHERE CONCAT(user_id,branch_id) IN ('11','22 )

然後創建一個新列,將 concat 轉換為將在插入時創建的自然鍵:

WHERE new_key IN ('11','22')

這將允許:

  • SELECT 查詢以避免 JOINS。我輸入了 user_id 和 branch_id,並且可以在應用程序中生成它。
  • 我可以在關鍵欄位上設置唯一約束,然後可以使用 UPSERT。

嚴格地生成這樣的自然鍵是為了更容易查找是不好的做法嗎?

澄清

我想使用 IN 子句,因為我將要查找很多組合值。

我沒有 ID 來建構 new_key 或查找它,它將是值。

我想我回答了我自己的問題。這是不好的做法,因為它是冗餘數據。

CONCAT 將是 JOIN 的更好選擇。進行優化,與其在數據庫中儲存值,不如像redis一樣在前面添加一個key-value儲存。

只需使用複合鍵。如果表的自然鍵是(user_id, branch_id),請使用它。

CREATE TABLE whatever
(
   user_id ....,
   branch_id ...,
   PRIMARY KEY(user_id, branch_id);
);

在聯接中,您可以像顯示的那樣執行此操作:

SELECT ...
FROM sometable s
INNER JOIN whatever w ON (s.user_id = w.user_id AND s.branch_id = w.branch_id)

或成對:

SELECT ...
FROM sometable s
INNER JOIN whatever w ON (s.user_id, s.branch_id) = (w.user_id = w.branch_id)

要與 一起使用IN,請使用匿名記錄列表:

SELECT ...
FROM whatever w
WHERE (w.user_id, w.branch_id) IN ( ('a','1'), ('b', '2'), ... )

或者,如果您有很多值,而這開始變得低效,請加入臨時表。大IN列表是不好的,無論它們是奇異值還是複合值。

引用自:https://dba.stackexchange.com/questions/147266