使用資料庫序號簡化位址變更追蹤
管理資料庫中的位址變更通常需要一個歷史表來記錄每次修改。 此表通常包括人員 ID、每次位址變更的序號、時間戳記和先前的位址。 然而,自動增加每個人的序號可能會非常複雜。
簡化方法:避免自動增量約束
不使用自動遞增序列或限制(這通常會導致複雜的解決方案),更簡單的方法涉及標準序列(自動遞增)或 IDENTITY 列:
<code class="language-sql">CREATE TABLE address_history ( address_history_id serial PRIMARY KEY, person_id INT NOT NULL REFERENCES people(id), created_at TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP, previous_address TEXT );</code>
使用視窗函數產生序號
透過這種表結構,視窗函數提供了一種優雅的解決方案,可以為每個人產生無間隙的連續數字:
<code class="language-sql">CREATE VIEW address_history_nr AS SELECT *, ROW_NUMBER() OVER (PARTITION BY person_id ORDER BY address_history_id) AS adr_nr FROM address_history;</code>
此檢視可直接取代原始資料表,在您的查詢中提供所需的序號 (adr_nr
)。
資料模型最佳化以提高效率
為了獲得最佳效能,請考慮以下資料模型改進:
TIMESTAMP WITHOUT TIME ZONE
(或TIMESTAMP WITH TIME ZONE
)來代替DATETIME
進行精確的時間追蹤。 previous_address
欄位就足夠了,無需單獨的 address
和 original_address
欄位。 這減少了儲存空間並提高了查詢速度。 以上是如何為資料庫中人員群組內的位址變更高效能產生唯一序號?的詳細內容。更多資訊請關注PHP中文網其他相關文章!