Postgresql
Canonical-or-best data type to store a Flake ID in PostgresSQL for two query patterns
I want to generate and write 128-bit k-ordered Flake IDs to a column from clients connected to my PostgreSQL database. These IDs are essentially a large globally-unique numbers that grow with time, similar to a monotonically increasing ID but without any coordination.
兩種最常見的查詢模式如下所示:
- 按 Flake ID 排序
SELECT * ORDER BY flake_id
- 按另一列分組,然後選擇每組中的最大 Flake ID。
SELECT max(flake_id) GROUP BY some_other_column
似乎有幾種可能的方法可以做到這一點:
bigint
有兩列。簡單排序,但不清楚如何在分組後在兩個單詞中選擇最大值。bytea
有 16 個字節。bit(n)
在哪裡n=128
uuid
恰好是 128 位的,測試產生 ORDER BY 結果,但是沒有max
可以應用的函式- 編碼為字元串,並儲存在
text
尚未對其進行測試但max
函式似乎無意義,除非它使用字典順序。使用字元串以數字方式對可以自行排序的內容進行編碼似乎也有點臟。在選項以及它們如何與索引互動以最有效地執行上述查詢模式時,存在一些選擇麻痺。
考慮到上述查詢模式,我正在尋找對理想數據類型的深入了解,以及它將如何與相關索引進行互動。
如果要使用兩個
bigint
s,請為 s 創建一個複合類型flake_id
:CREATE TYPE pair (a bigint, b bigint);
然後您的第一個查詢可以保持原樣,您的第二個查詢可以重寫為
SELECT DISTINCT ON (some_other_column) flake_id ORDER BY some_other_column, flake_id DESC;
但是你為什麼不使用明顯的數據類型
numeric
呢?