Många-till-många-relationer är det enda genomförbara alternativet här. Det finns en anledning till att de kallar det en relationsdatabas.
Varför?
- Anslutningar är faktiskt inte så dyra.
- Flera kolumner - Antalet kolumner i dina tabeller kommer att vara ludicris och det kommer att vara ett riktigt utvecklarhelvete. Eftersom varje funktion lägger till en migrering blir mängden churn i din kodbas dum.
- Array-kolumn - Att använda en array-kolumn kan verka som ett attraktivt alternativ tills du inser att det faktiskt bara är en marginell förbättring jämfört med att stoppa in saker i en kommaseparerad sträng. du har ingen referensintegritet och ingen av fördelarna med kodorganisationen som kommer från att ha modeller som representerar enheterna i din applikation.
Åh, och varje gång en funktion rycks ut måste du uppdatera var och en av dessa över 500 000 användare. VS använder bara 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