使用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://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。