← Back to list

Integrando ULID ao ActiveRecord no Rails: Melhore a Performance e Escalabilidade do seu Banco de…

O Ruby on Rails é um dos frameworks mais poderosos para a construção de aplicações web, e o ActiveRecord, sua ferramenta de…

DMVi · 2025-12-11 17:43 · 0 claps · 4.9 min read
#ruby #ruby-on-rails #activerecord #ulid #technology
Open on Medium ↗
Wiki topics: 🌐 · Web Development

Integrando ULID ao ActiveRecord no Rails: Melhore a Performance e Escalabilidade do seu Banco de Dados

O Ruby on Rails é um dos frameworks mais poderosos para a construção de aplicações web, e o ActiveRecord, sua ferramenta de Object-Relational Mapping (ORM), é uma das mais populares para manipulação de dados. No entanto, à medida que as aplicações crescem em termos de usuários e dados, a forma como gerenciamos os identificadores pode se tornar um gargalo de performance.

Tradicionalmente, o Rails utiliza IDs inteiros para identificar registros. Esses números são sequenciais, o que pode ser problemático quando lidamos com múltiplas instâncias de banco de dados ou quando a carga é distribuída entre servidores diferentes. É aqui que entram os ULIDs (Identificadores Universais Lexicograficamente Ordenáveis), que oferecem não só unicidade global, mas também uma ordenação eficiente e natural.

Neste post, vamos explorar como integrar o ULID ao ActiveRecord no Rails e como essa abordagem pode melhorar a performance e escalabilidade do seu banco de dados.

O que é um ULID?

Um ULID é um identificador único que combina um carimbo de data/hora de 48 bits com uma parte aleatória de 80 bits. O carimbo de data/hora possui resolução de milissegundos, garantindo que ULIDs criados em momentos diferentes sempre terão uma ordem lexicográfica consistente.

A principal vantagem do ULID é que ele é lexicograficamente ordenável. Isso significa que, ao contrário dos inteiros, que não podem ser facilmente ordenados sem processamento adicional, os ULIDs podem ser ordenados de forma eficiente com base no seu valor de string.

Além disso, o ULID combina unicidade global com a capacidade de gerar IDs de forma independente, sem a necessidade de servidores centralizados para coordenar a criação dos IDs.

Exemplo: 01ARZ3NDEKTSV4RRFFQ69G5FAV

Por que usar ULID no Rails?

  • Escalabilidade: IDs inteiros podem ser problemáticos em ambientes distribuídos, pois podem gerar colisões ou ser difíceis de gerenciar em múltiplos bancos de dados.
  • Performance: O fato de os ULIDs serem lexicograficamente ordenáveis melhora a performance em buscas e ordenações, especialmente quando lidamos com grandes volumes de dados.
  • Distribuição de carga: Em sistemas distribuídos, cada instância pode gerar IDs de forma independente, sem risco de colisões, eliminando a necessidade de um serviço centralizado para gerenciar a criação dos IDs.

Integrando o ULID ao ActiveRecord

Passo 1: Adicionar a gem ULID ao Rails

Para começar, adicione a gem ulid ao seu projeto Rails. Ela facilita a geração e manipulação de ULIDs.

No seu Gemfile:

gem "ulid"

Execute o comando para instalar a gem:

bundle install

Passo 2: Modificar os Modelos do ActiveRecord

Agora, vamos modificar os modelos para usar o ULID como tipo de ID, substituindo os tradicionais inteiros ou bigints.

Exemplo de código de migração:

class CreateUsers < ActiveRecord::Migration[6.0]
  def change
    create_table :users, id: :uuid do |t|
      t.string :name
      t.string :email
      t.timestamps
    end
  end
end

Aqui, alteramos o tipo do campo id para :uuid, que pode ser usado para armazenar ULIDs.

Passo 3: Modificar a Geração de IDs

Para garantir que o ID gerado pelo ActiveRecord seja um ULID, podemos modificar a classe base ApplicationRecord.

class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true
  before_create :set_ulid

  private

  def set_ulid
    self.id = ULID.generate
  end
end

Esse código garante que, toda vez que um novo objeto for criado, ele receberá um ULID gerado automaticamente.

Testando a Implementação

Novo Registro

Agora, crie um novo registro e verifique se o ID gerado é, de fato, um ULID.

user = User.create(name: "Ana da Silva", email: "ana@example.com")
puts user.id

Verificando a Ordenação

Demonstre como os IDs são ordenados lexicograficamente de maneira eficiente.

User.create(name: "Pedro", email: "pedro@example.com")
User.create(name: "Andre", email: "andre@example.com")
User.create(name: "Lucas", email: "lucas@example.com")

# Sorting users by ID (ULID)
users = User.order(:id)

O uso de ULID no Rails pode ser uma excelente maneira de melhorar a performance e a escalabilidade da sua aplicação. A integração com o ActiveRecord é simples, e os benefícios são claros: IDs gerados de forma distribuída, sem colisões, e a capacidade de ordenar os registros de maneira eficiente. Se sua aplicação lida com grandes volumes de dados ou precisa ser escalada horizontalmente, experimentar ULID pode ser um grande passo para otimizar a infraestrutura do seu banco de dados.

Diferença entre ULID, UUID e Snowflake ID

Embora o ULID seja uma excelente opção para muitos casos de uso, existem outros tipos de identificadores universais como UUID e Snowflake IDs. Vamos dar uma olhada nas principais diferenças entre eles:

UUID (Universally Unique Identifier)

Formato: 128 bits, representados como uma string hexadecimal de 36 caracteres.

Vantagens:

  • Unicidade global: Garante a unicidade global sem risco de colisões.
  • Ampla adoção: Usado amplamente em bancos de dados e sistemas de APIs.

Desvantagens:

  • Não ordenável: Não possui ordenação natural, o que pode afetar a performance de consultas e ordenações no banco de dados.
  • Tamanho maior: Um UUID ocupa 128 bits, o que o torna mais pesado do que outras alternativas.

Exemplo: 550e8400-e29b-41d4-a716-446655440000

ULID (Universally Unique Lexicographically Sortable Identifier)

Formato: 128 bits, geralmente representados como uma string de 26 caracteres base32.

Vantagens:

  • Ordenação lexicográfica: IDs são gerados em ordem temporal, melhorando a performance de consultas que dependem da ordenação.
  • Tamanho menor que UUID: Embora tenha o mesmo tamanho em bits, o ULID é mais eficiente em termos de armazenamento.
  • Distribuição independente: Pode ser gerado de forma distribuída, sem risco de colisões.

Desvantagens:

  • Dependência de hora do sistema: O ULID depende do relógio do sistema para gerar a parte temporal. Se o relógio não for preciso ou sofrer alterações (como mudanças de fuso horário), isso pode afetar a geração dos IDs.
  • Resolução temporal limitada: A resolução é de milissegundos, o que não é suficiente para aplicações que requerem maior precisão, como microssegundos ou nanosegundos.
  • Consumo de memória: ULID ocupa 128 bits, o que é maior do que outros identificadores como o Snowflake (64 bits).
  • Padronização e adoção limitada: Embora seja popular, a padronização do ULID não é tão robusta quanto o UUID, o que pode gerar dificuldades de compatibilidade em algumas ferramentas ou bibliotecas.

Exemplo: 01ARZ3NDEKTSV4RRFFQ69G5FAV

Snowflake ID

Formato: 64 bits, composto por carimbo de data/hora, ID do servidor/máquina, ID do processo e número de sequência.

Vantagens:

  • Ordenação temporal: O ID é baseado no carimbo de data/hora, garantindo a ordem sequencial dos IDs gerados.
  • Escalabilidade: Pode ser gerado de forma distribuída com um serviço de coordenação para garantir a unicidade.
  • Baixo consumo de memória: um ID do Snowflake ocupa apenas 64 bits.

Desvantagens:

  • Requer um serviço de coordenação: Para evitar conflitos, é necessário um serviço para gerenciar a criação de IDs.
  • Menos popular: Embora útil para grandes plataformas, o Snowflake não é tão amplamente adotado quanto o UUID e o ULID.

Exemplo: 1539071651349017600

Comparativo

Os identificadores ULID, UUID e Snowflake ID possuem características distintas, principalmente em relação ao tamanho, formato e capacidade de ordenação lexicográfica.

Tamanho

  • ULID e UUID compartilham o mesmo tamanho de 128 bits. No entanto, o ULID é representado por 26 caracteres no formato Base32, enquanto o UUID é representado por 36 caracteres em formato hexadecimal.
  • O Snowflake ID é significativamente menor, com apenas 64 bits.

Ordenação Lexicográfica

  • Tanto o ULID quanto o Snowflake ID suportam a ordenação lexicográfica (ou seja, a ordem de classificação das strings ou valores corresponde à ordem cronológica ou de criação).
  • Para o Snowflake ID, essa ordenação é garantida por ser baseada em um carimbo de data/hora (timestamp).
  • O UUID não oferece essa garantia de ordenação lexicográfica, o que pode impactar o desempenho da indexação em bancos de dados.

Formato

  • O ULID utiliza o formato Base32.
  • O UUID utiliza o formato Hexadecimal (base16).
  • O Snowflake ID é um Inteiro.

메타데이터
post_id
c103232b0a7f
slug
integrando-ulid-ao-activerecord-no-rails-melhore-a-performance-e-escalabilidade-do-seu-banco-de-c103232b0a7f
url
https://medium.com/@do_mavi/integrando-ulid-ao-activerecord-no-rails-melhore-a-performance-e-escalabilidade-do-seu-banco-de-c103232b0a7f
canonical_url
https://medium.com/@do_mavi/integrando-ulid-ao-activerecord-no-rails-melhore-a-performance-e-escalabilidade-do-seu-banco-de-c103232b0a7f
author_url
https://medium.com/@do_mavi
status
ok
fetched_at
2026-06-21 20:33:08