Question

Je pense à des façons de créer un système de contrôle d'accès basé sur les rôles dans Rails. Je l'ai vu ces grands projets aussi (entre autres):

Ma question est, est-il vraiment nécessaire d'avoir un pour tout table de jointure? Si je l'une des tables de la relation n'a plus que quelques valeurs (disons moins de 100), je ne peux pas fusionner juste la table de jointure avec cette petite table) Ce que je veux dire ... Voici ce que j'ai besoin:

Modèles

  • Utilisateur
  • Groupe
  • Rôle
  • Autorisation
  • UserRoles / RolesUsers
  • GroupRoles
  • Membre (GroupUsers)
  • RolePermissions

Quelque chose comme ça ...

La façon RoleRequirement fonctionne est de créer une table de roles et une table de jointure roles_users. Cela signifie que si je dispose de 20 rôles possibles au total dans une application, je

  • Tableau de rôle avec 20 lignes
  • table RolesUsers avec n lignes.

Ce qui signifie que chaque fois que je veux trouver un utilisateur par rôle, je dois faire une jointure. Je me demande cependant, car il n'y aura que quelques rôles dans une application, pourquoi ne pas simplement remplacer cette migration:

create_table "roles", :force => true do |t|
  t.string "name"
end

create_table "roles_users", :id => false, :force => true do |t|
  t.integer "role_id"
  t.integer "user_id"
end

avec celui-ci ...

create_table "roles", :force => true do |t|
  t.string "name"
  t.integer "user_id" # or some polymorphic form
end

Cela causerait duplication (tonnes de rôles « admin », par exemple), mais étant donné que l'espace ne coûte pas cher, et nous pourrions créer une méthode comme Role.unique pour trouver tous les rôles uniques (pour se débarrasser de cette table 20 rangée), pourquoi les gens créent la table de jointure?

Même chose avec les autorisations: Je ne vais probablement 4 autorisations pour commencer: create read update delete. Donc, je ne suis pas besoin d'une table d'autorisations et une table de roles_permissions, je pouvais dupliquer les autorisations CRUD et ont le role_id dans le tableau des autorisations. Même avec le groupe, je ne ai pas besoin des rôles du groupe si j'avais colonnes polymorphes dans ma table de roles.

Quelle est la méthode recommandée pour le faire?

Voici un extrait de la migration proposée .

Était-ce utile?

La solution

Je ne vous suggère de le faire. Ce que vous décrivez est appelé dénormalisation .

dénormalisation introduit des problèmes pour de nombreuses applications et ne doit être fait si vous avez une vision claire besoin pour elle. En général, je ne dénormaliser tables à des fins de rapports.

Votre question ne montre pas que vous avez besoin de dénormaliser. Au contraire, il montre une aversion peu judicieuse d'avoir des tables « supplémentaires », et d'éviter d'une simple jointure. Avoir des données dupliquées coûte plus qu'un simple espace, il en coûte aussi la performance (unique n'est pas un billet de faveur). SGBDR modernes sont tout à fait aptes à la manipulation des jointures.

Je vous suggère googler et la recherche SO des informations sur dénormalisation. Il n'y a pas de règle d'or, mais votre cas ne semble pas avoir une bonne raison de.

Si vous êtes à la recherche de gains de performance, jeter à la poubelle ActiveRecord. Il existe de nombreuses alternatives, et vous pouvez écrire votre propre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top