Veel-op-veel relaties zijn hier de enige haalbare optie. Er is een reden waarom ze het een relationele database noemen.
Waarom?
- Joins zijn eigenlijk niet zo duur.
- Meerdere kolommen - Het aantal kolommen in uw tabellen zal ludicris zijn en het zal een ware ontwikkelaarshel zijn. Omdat elke functie een migratie toevoegt, zal de hoeveelheid churn in je codebase belachelijk zijn.
- Array-kolom - Het gebruik van een array-kolom lijkt misschien een aantrekkelijk alternatief, totdat je je realiseert dat het in feite slechts een marginale verbetering is ten opzichte van het proppen van dingen in een door komma's gescheiden tekenreeks. je hebt geen referentiële integriteit en geen van de voordelen van codeorganisatie die voortkomen uit het hebben van modellen die de entiteiten in je applicatie vertegenwoordigen.
O, en elke keer dat een functie wordt gerukt, moet je al die 500k+ gebruikers bijwerken. VS gewoon CASCADE gebruiken.
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