加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Elixir Ecto: 在Postgres中使用UUID类型的主键

发布时间:2020-12-13 16:56:58 所属栏目:百科 来源:网络整理
导读:使用UUID作为主键的目的 降低Serial类型这种自增ID线性特征,UUID作为随机生成的字符串,让ID更离散,增强系统的反爬虫能力(至少避免通过ID的线性增加来爬取内容这种最简单的爬取方式) 使用主键的是那种方式,各有优缺点,可按实际需求自行权衡 在应用程序中生成U

使用UUID作为主键的目的

降低Serial类型这种自增ID线性特征,UUID作为随机生成的字符串,让ID更离散,增强系统的反爬虫能力(至少避免通过ID的线性增加来爬取内容这种最简单的爬取方式)

使用主键的是那种方式,各有优缺点,可按实际需求自行权衡

  • 在应用程序中生成UUID,并插入到数据库

  • 通过使用pgcrypto扩展自动生成

这里只说明如何使用pgcrypto扩展自动生成UUID Type主键.

数据库方面

通过调用 pgcrypto 扩展模块中的 gen_random_uuid() 函数可以生成UUID. 要使用该函数,首先需要创建扩展:

CREATE EXTENSION pgcrypto;

生成UUID

SELECT gen_random_uuid();

作为主键使用

CREATE SCHEMA IF NOT EXISTS developerworks;  

CREATE TABLE developerworks.contacts (  
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),name TEXT,email TEXT
);

插入测试数据

INSERT INTO developerworks.contacts (name,email) VALUES  
('Dr Nic Williams','drnic'),('Brian Mattal','brian'),('Wayne E. Seguin','wayneeseguin'),('Long Nguyen','long'),('Bill Chapman','bill'),('Chris Weibel','chris'),('Jeremey Budnack','jrbudnack'),('Ruben Koster','rkoster'),('Jamie Van Dyke','jamie'),('Quintessence Anx','qanx'),('McGowan','mcg'),('高,秀娇 (XJ)','xj'),('Geoff Franks','geoff'),('Van Nguyen','vnguyen'),('John Longanecker','jlonganecker')
;

查询结果

SELECT * FROM developerworks.contacts;

迁移脚本定义

defmodule Jianpan.Repo.Migrations.CreatePrefixNodes do
  use Ecto.Migration

  def change do
    create table(:prefix_nodes,primary_key: false) do
      add :id,:uuid,primary_key: true,default: fragment("gen_random_uuid()")
      add :order,:integer
      add :name,:string
      add :is_deleted,:boolean,default: false,null: false
      add :parent_id,references(:prefix_nodes,type: :uuid,on_delete: :delete_all)

    end
    create index(:prefix_nodes,[:parent_id])

  end
end

参考资料

  • http://websymphony.net/blog/2...

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读