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

参考资料


developerworks
1.7k 声望266 粉丝