Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

279
Vistas
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 Respuestas
Responde la pregunta

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 Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda