慣性聚合 関心のあるブログ、ニュース、テクノロジーを効率的に追跡
原文を読む 慣性聚合で開く

おすすめ購読元

小众软件
小众软件
博客园 - 叶小钗
有赞技术团队
有赞技术团队
大猫的无限游戏
大猫的无限游戏
博客园_首页
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
L
LangChain Blog
Hugging Face - Blog
Hugging Face - Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
aimingoo的专栏
aimingoo的专栏
Blog — PlanetScale
Blog — PlanetScale
爱范儿
爱范儿
T
Tailwind CSS Blog
Jina AI
Jina AI
量子位
Stack Overflow Blog
Stack Overflow Blog
人人都是产品经理
人人都是产品经理
J
Java Code Geeks
V
Visual Studio Blog
月光博客
月光博客

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant Common SOC 2 Failures (Real World) Stop Vibe-Checking Your AI App: A Practical Guide to Evals How to Use SonarQube and SonarScanner Locally to Level Up Your Code Quality Your Next To-Do App Is Dead — I Replaced Mine with an OpenClaw AI Sign a Nostr event in 60 lines of Python using coincurve — no nostr-sdk, no nbxplorer, no rust toolchain ITGC Audit Explained Like You’re in Big 4 Patch Tuesday abril 2026: Microsoft parcha 163 vulnerabilidades y un zero-day en SharePoint Stop scraping everything: a better way to track competitor price changes Listing on MCPize + the Official MCP Registry while routing payments OUTSIDE the marketplace — how I kept 100% of my x402 revenue Building an AI-Powered Risk Intelligence System Using Serverless Architecture Why We Ripped Function Overloading Out of Our AI Toolchain Testing AI-Generated Code: How to Actually Know If It Works SaaS Churn Is Killing Your Business. Here Is What to Do About It (Without a Support Team) The Speed of AI Is No Longer Linear - And Self-Improving Models Are Why How to Implement RBAC for MCP Tools: A Practical Guide for Engineering Teams From Standard Quote to Persuasive Proposal: AI Automation for Arborists I built a CLI that scaffolds complete multi-tenant SaaS apps Axios CVE-2025–62718: The Silent SSRF Bug That Could Be Hiding in Your Node.js App Right Now The dashboard that ended our friendship Data Pipelines Explained Simply (and How to Build Them with Python)
より良いプライマリキー:Rails開発者のためのULIDsガイド
Zil Norvilis · 2026-05-28 · via DEV Community

以前の記事で、Snowflake IDsについて話しました。それらは素晴らしいですが、「Worker IDs」を管理するための設定が必要なので少し手間がかかります。

もっとシンプルで同じ利点(セキュアなURLと高速なデータベースソート)を提供するものが必要な場合は、ULIDs(Universally Unique Lexicographically Sortable Identifiers)を検討してください。

なぜ UUID を使わないのですか?

大多数の開発者は自動増分整数から UUID に切り替えます。彼らは自分のビジネスの規模を隠したいからです。あなたの注文 ID が order/550e8400-e29b... であれば、あなたが 1 人の顧客を持っているか 100 万人の顧客を持っているか誰も知りません.

しかし UUID には大きな問題があります: 彼らは完全にランダムです。
数百万のランダムUUIDをデータベースに挿入すると、「B-Tree」インデックスがフラグメント化して遅くなります。あなたのデータベースは新しいデータを置く場所を見つけるためにハードドライブのあちこちを飛び回らなければなりません.

ULIDsはこれを解決します.
ULIDは128ビット(UUIDと同じように)、ただしIDの最初の部分はタイムスタンプです これは ULIDs が時系列順であることを意味します。UUID のようにユニークですが、整数のようにソートされます。

Rails 8 アプリで ULIDs を実装する方法は以下の 4 つの簡単なステップです。

ステップ 1:Gem のインストール

ULIDs の文字列を生成するために ulid gem を使用します。Gemfile に次を追加します。

gem "ulid"

Enter fullscreen mode Exit fullscreen mode

走るbundle installターミナルで。

ステップ2:ULIDの懸念

ULIDsを任意のモデルに簡単に追加できるようにしたい。これを行う最良の方法は、心配このコードにより、新しいレコードを作成するたびにULIDが生成され、IDに割り当てられます。

新しいファイルを作成してapp/models/concerns/has_ulid.rb:

# app/models/concerns/has_ulid.rb
module HasUlid
  extend ActiveSupport::Concern

  included do
    # Before we save to the DB, generate the ULID
    before_create :set_ulid
  end

  private

  def set_ulid
    # ULID.generate creates a string like: 01ARZ3NDEKTSV4RRFFQ69G5FAV
    self.id ||= ULID.generate
  end
end

フルスクリーンモードを開始 フルスクリーンモードを終了

ステップ3:マイグレーション

新しいモデルを作成すると、Railsにidstringであることを伝える必要があり、デフォルトの自動増分ロジックを無効にする必要があります

rails g model Product name:string

フルスクリーンモードを開始 フルスクリーンモードを終了

マイグレーションファイルを開き、このように編集します:

# db/migrate/XXXXXXXXXXXXXX_create_products.rb
class CreateProducts < ActiveRecord::Migration[8.0]
  def change
    # id: false stops the automatic integer ID
    create_table :products, id: false do |t|
      # We use string for ULID primary key
      t.string :id, primary_key: true
      t.string :name

      t.timestamps
    end
  end
end

フルスクリーンモードに入る フルスクリーンモードから抜ける

ステップ4:モデルを更新

今、ステップ2で書いた懸念を含めます。

# app/models/product.rb
class Product < ApplicationRecord
  include HasUlid
end

フルスクリーンモードに入る フルスクリーンモードから抜ける

ステップ5:実際に確認する

あなたのRailsコンソールを開きますbin/rails c と数件の製品を作成します:

Product.create(name: "Laptop")
Product.create(name: "Monitor")
Product.create(name: "Keyboard")

# Check the IDs
Product.pluck(:id)
# => ["01HQV...", "01HQV...", "01HQV..."]

フルスクリーンモードを開始 フルスクリーンモードを終了

よく見ると、ID はすべて同じ文字で始まります。同じ分に作成されたからです。ソート可能なので、Product.order(:id) を実行して、正しい時系列順序になります!

なぜ私は Rails に ULIDs を好むのか

  1. より良いパフォーマンス: IDがソート可能であるため、PostgreSQL(またはSQLite)はそれらをインデックスの末尾に追加できます。これは「書き込み重視」アプリケーションにとってランダムなUUIDよりもずっと速くなります。
  2. 読みやすさ: ULIDsは「I」、「L」、「O」のような混乱を招く文字を含まない特別なアルファベット(CrockfordのBase32)を使用しており、ユーザーがタイプする必要がある場合に読みやすくなります。
  3. 設定不要: Snowflake IDとは異なり、サーバーIDやワーカーノードを設定する必要はありません。ゲムをインストールして使うだけです.

それだけです。アプリケーションがよりプロフェッショナルでスケーラブルに感じられる小さなアーキテクチャの変更です。