ここでは、多対多の関係が唯一の実行可能なオプションです。彼らがそれをリレーショナルデータベースと呼ぶのには理由があります。
なんで?
- 結合は実際にはそれほど高価ではありません。
- 複数の列-テーブルの列の数はludicrisになり、真の開発者の地獄になります。各機能が移行を追加すると、コードベースのチャーンの量はばかげています。
- 配列列-配列列を使用することは、実際にはコンマ区切りの文字列に詰め込むよりもわずかに改善されていることに気付くまで、魅力的な代替手段のように思えるかもしれません。参照の統合性はなく、アプリケーション内のエンティティを表すモデルを持つことによるコード編成のメリットもありません。
ああ、機能がヤンクされるたびに、50万人以上のユーザー全員を更新する必要があります。 CASCADEを使用するだけのVS。
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