Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

275
Views
Postgres: muchos a muchos frente a columnas múltiples frente a columna de matriz

Necesito ayuda para diseñar permisos de usuario complejos dentro de una base de datos de Postgres. En la aplicación my Rails, cada usuario podrá acceder a un conjunto único de funciones. En otras palabras, no hay "roles" predefinidos que determinen a qué funciones puede acceder un usuario.

En casi todos los controladores/vistas, la aplicación verificará si el usuario actual tiene o no acceso a diferentes funciones. Idealmente, la aplicación proporcionará ~100 funciones diferentes y admitirá más de 500k usuarios.

Por el momento, estoy considerando tres opciones diferentes (¡pero bienvenidas las alternativas!) y me gustaría saber qué opción ofrece el mejor rendimiento. Gracias de antemano por cualquier ayuda/sugerencia.

Opción 1: relación de muchos a muchos

Al construir una relación de muchos a muchos entre la tabla User y la tabla de funciones, la aplicación podría verificar si un usuario tiene acceso a una Feature determinada consultando la tabla de combinación.

Por ejemplo, si hay un registro en la tabla de combinación que conecta user1 y feature1 , entonces user1 tiene acceso a feature1 .

Opción 2: Múltiples columnas

La aplicación podría representar cada característica como una columna booleana en la tabla User . Esto evitaría consultar varias tablas para verificar los permisos.

Por ejemplo, si user1.has_feature1 es verdadero, entonces user1 tiene acceso a feature1 .

Opción 3: columna de matriz

La aplicación podría almacenar funciones como cadenas en una columna de matriz (¿indexada por GIN?) en la tabla User . Luego, para verificar si un usuario tiene acceso a una función, buscaría en la columna de la matriz la función dada.

Por ejemplo, si user1.features.include? 'feature1' es verdadero, entonces user1 tiene acceso a feature1 .

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

Las relaciones de muchos a muchos son la única opción viable aquí. Hay una razón por la que lo llaman una base de datos relacional.

¿Por qué?

  • Las uniones en realidad no son tan caras.
  • Múltiples columnas: la cantidad de columnas en sus tablas será ridícula y será un verdadero infierno para los desarrolladores. Como cada función agrega una migración, la cantidad de abandono en su base de código será una tontería.
  • Columna de matriz: el uso de una columna de matriz puede parecer una alternativa atractiva hasta que se da cuenta de que en realidad es solo una mejora marginal en comparación con rellenar cosas en una cadena separada por comas. no tiene integridad referencial y ninguno de los beneficios de organización del código que se derivan de tener modelos que representan las entidades en su aplicación.
    Ah, y cada vez que se elimina una función, debe actualizar a cada uno de esos más de 500k usuarios. VS simplemente usando CASCADE.

 class Feature has_many :user_features has_many :users, through: :user_features end class UserFeature belongs_to :user belongs_to :feature end class User has_many :user_features has_many :features, through: :user_features def has_feature?(name) features.exist?(name: name) end end
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!