Postgresql
數據倉庫——生成用於 WHERE 子句的自然鍵
我需要根據多個 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
列表是不好的,無論它們是奇異值還是複合值。