在 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

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


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

查看所有标签

猜你喜欢:

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

颠覆医疗

颠覆医疗

[美]埃里克·托普 / 张南、魏薇、何雨师 / 译言·东西文库/电子工业出版社 / 2014-1-20 / 55.00

“创造性破坏”是奥地利经济学家约瑟夫·熊彼特最著名的理论,当一个产业在革新之时,都需要大规模地淘汰旧的技术与生产体系,并建立起新的生产体系。电器之于火器、汽车之于马车、个人计算机之于照排系统,都是一次又一次的“创造性破坏”,旧的体系完全不复存在,新的体系随之取代。 “创造性破坏”已经深深地改变了我们的生活,在这个数字时代,我们身边的一切都被“数字化”了。只有一处,也许是由于其本身的根深蒂固,......一起来看看 《颠覆医疗》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器