使用UUID作为主键的目的
降低Serial类型这种自增ID线性特征,UUID作为随机生成的字符串,让ID更离散,增强系统的反爬虫能力(至少避免通过ID的线性增加来爬取内容这种最简单的爬取方式)
使用主键的是那种方式,各有优缺点,可按实际需求自行权衡
数据库方面
通过调用 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