Slide 1

Slide 1 text

最新の Rails で PostgreSQL を使う良さ @nyo_taro

Slide 2

Slide 2 text

井上 翔太朗 (@nyo_taro) セールステックのエンジニア 好きなエディタは VScode 特徴 ・八王子に生息 ・コーヒーは最近浅煎り ・ ZORN のファン 自己紹介 @nyo_taro

Slide 3

Slide 3 text

@nyo_taro

Slide 4

Slide 4 text

前提 PostgreSQL とは SaaS における PostgreSQL の利用 Rails の PostgreSQL サポート 今回のはなすこと @nyo_taro

Slide 5

Slide 5 text

今日はこんな話をします Rails で使える PostgreSQL で基本的な機能について Rails と PostgreSQL の最新の使用することで得られる恩恵についてお話 します。 前提 @nyo_taro

Slide 6

Slide 6 text

PostgreSQL は、カリフォルニア大学バークレー校のコンピューター サイエン ス学部で開発された、オブジェクト リレーショナル データベース管理システ ム ( ORDBMS ) です。 PostgreSQL とは @nyo_taro

Slide 7

Slide 7 text

Rails では PostgreSQL はデフォルトでサポートされており Rails ガイドも PostgreSQL の使い方が丁寧に記載されています。 https://railsguides.jp/active_record_postgresql.html Rails と PostgreSQL @nyo_taro

Slide 8

Slide 8 text

@nyo_taro

Slide 9

Slide 9 text

SaaS における PostgreSQL の利用 @nyo_taro

Slide 10

Slide 10 text

2016 年バージョン 9.5 で行単位セキュリティ( RLS )が追加された! 行レベルで DB テナントごとに取得・追加・削除・更新を保護してくれ許 可しなければその操作は拒否される RLS(Row Level Security) @nyo_taro

Slide 11

Slide 11 text

複数企業 ( テナント ) が 1 つのシステムを共有する シングルテナントに比べて低コストで利用できる マルチテナント @nyo_taro

Slide 12

Slide 12 text

RLS あり RLS なし select * from users id name tenant_id 1 a 1 4 b 1 select * from users id name tenant_id 1 a 1 2 a 2 3 a 3 4 b 1 @nyo_taro

Slide 13

Slide 13 text

PostgreSQL の機能の Rails サポート @nyo_taro

Slide 14

Slide 14 text

JSON 、 JSONB データ型 : 非構造化データや動的なスキーマを持つデータ を扱うことができます。 配列データ型 : 単一のカラムに複数の値を格納することができます。 hstore: キーと値のペアを格納するためのデータ型 範囲型( Range Types ) : 日付、数値、時間の範囲を表すためのデータ型 Rails の PostgreSQL サポート ( 一部抜粋 ) @nyo_taro

Slide 15

Slide 15 text

ENUM の migration が使いやすくなる 外部キー制約に deferrable を指定可能になった PostgreSQL12 生成列( generated column) のサポート PostgreSQL15 NULLS NOT DISTINCT をサポート Rails7 での PostgreSQL サポートの強化 @nyo_taro

Slide 16

Slide 16 text

ENUM の migration が使いやすくなる before execute <<-SQL CREATE TYPE status AS ENUM ('draft', 'published', 'archived', 'trashed'); SQL create_table :articles do |t| t.column :current_status, :status end after change_table :articles do |t| t.enum :current_status, enum_type: "status", default: "draft", null: false end create_enum :status, %w[draft published archived trashed] @nyo_taro

Slide 17

Slide 17 text

before execute <<-SQL ALTER TABLE users ADD COLUMN full_name character varying GENERATED ALWAYS AS (last_name || first_name) STORED SQL after add_column :users, :full_name, :virtual, type: :text, as: "last_name || first_name", stored: true PostgreSQL12 生成列( generated column) のサポート @nyo_taro

Slide 18

Slide 18 text

user = User.create(first_name: ' 太郎', last_name: ' 山田') User.last.full_name # => " 山田太郎" PostgreSQL12 生成列( generated column) のサポート @nyo_taro

Slide 19

Slide 19 text

Rails 内でのテストも追加される @nyo_taro

Slide 20

Slide 20 text

message が同じでも tag が NULL であれば、複数のレコードが許容 UNIQUE (message, tag) message が同じで tag が NULL のレコードは一つしか許容されない UNIQUE NULLS NOT DISTINCT(message, tag) PostgreSQL15 NULLS NOT DISTINCT @nyo_taro

Slide 21

Slide 21 text

`UNIQUE (message, tag)` `UNIQUE NULLS NOT DISTINCT(message, tag)` id message tag 1 hello NULL 2 hello NULL 3 hello NULL id message tag 1 hello NULL 2 hello tag1 3 hello tag2 PostgreSQL15 NULLS NOT DISTINCT @nyo_taro

Slide 22

Slide 22 text

Rails を最新にすることで Rails の機能を使って DB の新機能を使える Rails を使うことでサポートしていないなどのテストもある PostgreSQL の最新の機能を使えることで開発の選択肢が広がる まとめ @nyo_taro

Slide 23

Slide 23 text

ご静聴ありがとうございました! @nyo_taro