美文网首页
odoo 分布式id

odoo 分布式id

作者: 伟大的洪立 | 来源:发表于2020-07-02 14:35 被阅读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

    相关文章

      网友评论

          本文标题:odoo 分布式id

          本文链接:https://www.haomeiwen.com/subject/iphrqktx.html