odoo 分布式id
2020-07-02 本文已影响0人
伟大的洪立
1、在odoo的base下面的base_data.sql文件中添加以下代码形成分布式id算法
CREATE SEQUENCE '表名' INCREMENT BY 1 START WITH 1;
CREATE OR REPLACE FUNCTION public.next_id(OUT result bigint) AS $$
DECLARE
-- 时间戳开始时间:2010年1月1日0点0分0秒,最大位数为41
our_epoch bigint := 1262275200000;
-- 当前时间,最大位数为41
now_millis bigint;
-- 公有云id为1,私有云为0,最大位数为1
service_id bigint := 1;
-- 切片id为1,最大位数为9
shard_id int := 1;
-- id序列,最大位数为13
seq_id bigint;
BEGIN
SELECT nextval('public.表名') % 8192 INTO seq_id;
SELECT FLOOR(EXTRACT(EPOCH FROM clock_timestamp()) * 1000) INTO now_millis;
-- 生成的id结构为 时间戳+公/私有云id+切片id+
result := ((now_millis - our_epoch) << 23);
result := result | (service_id << 22);
result := result | (shard_id << 13);
result := result | seq_id;
END;
$$ LANGUAGE PLPGSQL;
2、在odoo创建数据库执行建表sql时通过执行算法将数据库自动生成的id替换掉,同时为了处理js双精度,不支持64位整数的问题,目前将id键在数据库中存为string形式。
最终建成的数据库如下
image.png