使用数据库序列号简化地址更改跟踪
管理数据库中的地址更改通常需要一个历史表来记录每次修改。 该表通常包括人员 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中文网其他相关文章!