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