在 postgres 中重构用户表的 ID

栏目: 数据库 · 发布时间: 6年前

内容简介:而我的用户表的 ID 采用了整型自增的数据类型,为了使我的网站的用户数看起来不太寒碜,我绝对把我的用户 id 拉长一些!我的数据库采用 postgres

GET /users/:ID 是一个非常典型的 REST API。最近在浏览我的应用时,经常会有

> GET /users/3 HTTP/1.1
> Host: shanyue.tech
> User-Agent: curl/7.54.0
> Accept: */*
>
< HTTP/1.1 404 Not Found
...
复制代码

而我的用户表的 ID 采用了整型自增的数据类型,为了使我的网站的用户数看起来不太寒碜,我绝对把我的用户 id 拉长一些!

我的数据库采用 postgres

本文链接: shanyue.tech/post/refact…

设置外键,同步更新

对所有用户用户表 ID 的关联表设置外键,并且设置 on update cascade ,使之当用户表 ID 发生变化时,关联表的 user_id 可以同步更新

alter table todo add constraint todo_user_id_fkey foreign key (user_id) references users(id) on update cascade
复制代码

迁移旧数据

把所有用户的 ID 放大16倍,并且添加一个 10086 的基数。有一种拉面的既视感..

注意以下第一条 SQL 有问题

-- update users set id = id * 16 + (random() * 16)::integer + 10086
update users set id = id * 16 + ceil(random() * 15) + 10086
复制代码

如果以上语句没有报错,那就说明用户量实在是太少了,如果数据量较多会发生主键冲突。

采用负负得正的方法避免主键冲突

update users set id = id * -16 - ceil(random() * 15) + 10086
update users set id = -id
复制代码

设置 Sequence

当旧有数据清理完毕,新增数据也采用自增 16 的方式,这里需要熟悉 postgres 中 Sequence 的用户,见最后参考

> select currval('users_id_seq')
currval
16
> alter SEQUENCE users_id_seq INCREMENT by 16
> select max(id) from users
max
20000
> select setval('users_id_seq', 20000)

复制代码

why not uuid

因为它太长了,而我的用户数又太少,它的优点我不但吸取不到,还经常会面对一串字符的茫然...


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Agile Web Development with Rails 4

Agile Web Development with Rails 4

Sam Ruby、Dave Thomas、David Heinemeier Hansson / Pragmatic Bookshelf / 2013-10-11 / USD 43.95

Ruby on Rails helps you produce high-quality, beautiful-looking web applications quickly. You concentrate on creating the application, and Rails takes care of the details. Tens of thousands of deve......一起来看看 《Agile Web Development with Rails 4》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换