Frage

Ich denke darüber nach, wie ich ein rollenbasiertes Zugriffskontrollsystem in Schienen schaffen kann. Ich habe diese großartigen Projekte auch (unter anderem) gesehen:

Meine Frage ist, ist es wirklich notwendig, einen Join -Tisch für alles zu haben? Wenn ich eines der Tabellen in der Beziehung nur ein paar Werte hat (sagen weniger als 100), kann ich dann nicht einfach die Join -Tabelle mit dieser kleinen Tabelle zusammenführen?). Das meine ich ... hier ist was ich brauche:

Modelle

  • Benutzer
  • Gruppe
  • Rolle
  • Genehmigung
  • Userroles/Rollen
  • Zapfen
  • Mitgliedschaften (Gruppierer)
  • Rolepremissionen

Sowas in der Art...

Der Weg Rolequirement Werke erstellen a roles Tisch und a roles_users Tisch beibringen. Dies bedeutet, dass ich, wenn ich insgesamt 20 mögliche Rollen in einer Anwendung habe, ich habe

  • Rollentabelle mit 20 Zeilen
  • ROLESUSERS -TABELLE mit N Zeilen.

Das heißt, jedes Mal, wenn ich einen Benutzer durch Rolle finden möchte, muss ich einen Join machen. Ich frage mich jedoch, da es nur einige Rollen in einer Anwendung geben wird, warum nicht einfach diese Migration ersetzen:

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

mit diesem...

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

Das würde Duplikation verursachen (z. Role.unique Um alle einzigartigen Rollen zu finden (um diese 20-Reihen-Tabelle loszuwerden), warum erstellen die Leute die Join-Tabelle?

Gleiches gilt für Berechtigungen: Ich werde wahrscheinlich nur 4 Berechtigungen haben, um zu beginnen: create read update delete. Daher brauche ich keine Berechtigungstabelle und eine Rollen -Tabelle. Gleiches gilt für Gruppe, ich brauche keine Gruppenrollen, wenn ich polymorphe Säulen in meinem hatte roles Tisch.

Wie ist der empfohlene Weg, dies zu tun?

Hier ist ein Ausschnitt der vorgeschlagenen Migration.

War es hilfreich?

Lösung

Ich würde nicht vorschlagen, dass Sie dies tun. Was Sie beschreiben, heißt Denormalisierung.

Die Denormalisierung führt zu Problemen für viele Anwendungen und sollte nur dann durchgeführt werden, wenn Sie eine Klare haben brauchen dafür. Ich denormalisiert in der Regel nur Tabellen für Berichtszwecke.

Ihre Frage zeigt nicht, dass Sie eine Bedürfnisse haben müssen, um zu denormalisieren. Vielmehr zeigt es eine fehlgeleitete Abneigung gegen "zusätzliche" Tische und vermeidet einen einfachen Join. Mit doppelten Daten kostet mehr als nur Platz und kostet auch die Leistung (einzigartig ist kein Werbegeschenk). Moderne RDBMs sind ziemlich geschickt bei der Handhabung.

Ich würde vorschlagen, zu googeln und zu suchen, um Informationen zur Denormalisierung zu erhalten. Es gibt keine goldene Regel, aber Ihr Fall scheint keinen guten Grund zu haben.

Wenn Sie nach Leistungssteigerungen suchen, werfen Sie Activerecord in den Müll. Es gibt viele Alternativen, und Sie können Ihre eigenen schreiben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top