Mange-til-mange-forhold er den eneste levedygtige mulighed her. Der er en grund til, at de kalder det en relationel database.
Hvorfor?
- Joins er faktisk ikke så dyre.
- Flere kolonner - Antallet af kolonner i dine tabeller vil være ludicris, og det vil være sandt udviklerhelvede. Da hver funktion tilføjer en migrering, vil mængden af churn i din kodebase være fjollet.
- Array-kolonne - Brug af en array-kolonne kan virke som et attraktivt alternativ, indtil du indser, at det faktisk kun er en marginal forbedring i forhold til at fylde ting i en kommasepareret streng. du har ingen referenceintegritet, og ingen af fordelene ved kodeorganisationen, der kommer fra at have modeller, der repræsenterer entiteterne i din applikation.
Åh, og hver gang en funktion rykkes, skal du opdatere hver eneste af disse 500.000+ brugere. VS kun ved at bruge 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