sql >> Base de Datos >  >> RDS >> PostgreSQL

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

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é?

  • En realidad, las uniones no son tan caras.
  • Columnas múltiples: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 el relleno de elementos en una cadena separada por comas. no tiene integridad referencial ni 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