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

使用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

参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值