Bevorzugte Datenbank-design-Methode für die Zuweisung von Benutzerrollen? (Hüte vs. Gruppen)
Ich habe mittlere MySQL-Datenbank mit einer primären "Personen" - Tabelle, die enthält grundlegende Informationen über jedes menschliche Wesen, verbunden mit dem Theater und Theater-Schule für die ich zuständig bin für den Erhalt und die Entwicklung einer Reihe von web-Anwendungen.
Einige Personen, die nur Kontakte - das ist Ihre "Personen" - Tabelle-Datensatz alle Informationen, die wir speichern über Sie. Viele andere jedoch haben zu können, übernehmen verschiedene Rollen für eine Vielzahl von Systemen. Von diesen, die meisten beginnen als Studenten. Einige beginnen als Mitarbeiter. Menschen, die Studenten können sich Praktikanten oder Interpreten, die Mitarbeiter können sich Studenten, Lehrkräfte, Mitarbeiter und Interpreten, etc.
Im wesentlichen, gibt es eine Vielzahl von verschiedenen "Hüte", die jede einzelne person haben mag zu tragen, um Zugriff auf und die Interaktion mit anderen teilen des Systems, sowie Informationen über Sie zur Verfügung gestellt, auf öffentlichen Seiten auf unserer Website.
Meine Wahl für die Umsetzung dieses Modells besteht darin, mehrere andere Tische, die repräsentieren diese "Hüte" - Tabellen, die meta-Informationen zur Ergänzung der basic - "person" - info, die alle verwenden die "Personen-id" als Ihre primäre Schlüssel. Zum Beispiel eine person, die ein Lehrer hat einen Eintrag in ein Lehrer-Tabelle, die seine oder Ihre kurze, biographische Informationen und rate zahlen. Alle Lehrer sind auch Angestellte (aber nicht alle Mitarbeiter sind Lehrer), das heißt, Sie haben einen Datensatz in der Tabelle Mitarbeiter, die Ihnen erlaubt, zu Unterwerfen, die Ihre Stunden in unserem payroll-system.
Meine Frage ist, was sind die Nachteile für die Umsetzung des Modells als solche? Die einzige andere Möglichkeit die ich mir denken kann ist, aufblasen, um den Personen-Tabelle mit Feldern, die leer und nutzlos für die meisten Einträge und müssen dann umständlich mit der Tabelle "Gruppen" zu denen Personen gehören, und dann die fast jeder Tabelle für jedes system eine person person_id
foreign key-und dann davon abhängen, business-Logik, um zu überprüfen, dass die person_id verwiesen wird, gehört in die entsprechende Gruppe; Aber das ist dumm, nicht wahr?
Ein paar Beispiel-Tabelle Erklärungen Folgen unten, die hoffentlich zeigen sollte, wie ich bin derzeit dabei, alle diese zusammen, und hoffentlich zeigen, warum ich denke, es ist ein sinnvoller Weg, um ein Modell für die Realität der verschiedenen Situationen, die Systeme zu bewältigen haben.
Alle Vorschläge und Kommentare sind willkommen. Ich Schätze Ihre Zeit.
BEARBEITEN wenige befragte haben erwähnt, dass die Verwendung von ACLs für die security, die ich nicht erwähnt habe in meiner ursprünglichen Frage, ich bin in der Tat mit einem separaten ACL-Paket für fine-grained access control für den tatsächlichen Nutzern der verschiedenen Systeme. Meine Frage ist mehr über die best practices für die Speicherung von Metadaten über Menschen, die in der Datenbank-schema.
CREATE TABLE persons (
`id` int(11) NOT NULL auto_increment,
`firstName` varchar(50) NOT NULL,
`middleName` varchar(50) NOT NULL default '',
`lastName` varchar(75) NOT NULL,
`email` varchar(100) NOT NULL default '',
`address` varchar(255) NOT NULL default '',
`address2` varchar(255) NOT NULL default '',
`city` varchar(75) NOT NULL default '',
`state` varchar(75) NOT NULL default '',
`zip` varchar(10) NOT NULL default '',
`country` varchar(75) NOT NULL default '',
`phone` varchar(30) NOT NULL default '',
`phone2` varchar(30) NOT NULL default '',
`notes` text NOT NULL default '',
`birthdate` date NOT NULL default '0000-00-00',
`created` datetime NOT NULL default '0000-00-00 00:00',
`updated` timestamp NOT NULL,
PRIMARY KEY (`id`),
KEY `lastName` (`lastName`),
KEY `email` (`email`)
) ENGINE=InnoDB;
CREATE TABLE teachers (
`person_id` int(11) NOT NULL,
`bio` text NOT NULL default '',
`image` varchar(150) NOT NULL default '',
`payRate` float(5,2) NOT NULL,
`active` boolean NOT NULL default 0,
PRIMARY KEY (`person_id`),
FOREIGN KEY(`person_id`) REFERENCES `persons` (`id`)
ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB;
CREATE TABLE classes (
`id` int(11) NOT NULL auto_increment,
`teacher_id` int(11) default NULL,
`classstatus_id` int(11) NOT NULL default 0,
`description` text NOT NULL default '',
`capacity` tinyint NOT NULL,
PRIMARY KEY(`id`),
FOREIGN KEY(`teacher_id`) REFERENCES `teachers` (`id`)
ON DELETE RESTRICT ON UPDATE CASCADE,
FOREIGN KEY(`classstatus_id`) REFERENCES `classstatuses` (`id`)
ON DELETE RESTRICT ON UPDATE CASCADE,
KEY (`teacher_id`,`level_id`),
KEY (`teacher_id`,`classstatus_id`)
) ENGINE=InnoDB;
CREATE TABLE students (
`person_id` int(11) NOT NULL,
`image` varchar(150) NOT NULL default '',
`note` varchar(255) NOT NULL default '',
PRIMARY KEY (`person_id`),
FOREIGN KEY(`person_id`) REFERENCES `persons` (`id`)
ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB;
CREATE TABLE enrollment (
`id` int(11) NOT NULL auto_increment,
`class_id` int(11) NOT NULL,
`student_id` int(11) NOT NULL,
`enrollmenttype_id` int(11) NOT NULL,
`created` datetime NOT NULL default '0000-00-00 00:00',
`modified` timestamp NOT NULL,
PRIMARY KEY(`id`),
FOREIGN KEY(`class_id`) REFERENCES `classes` (`id`)
ON DELETE RESTRICT ON UPDATE CASCADE,
FOREIGN KEY(`student_id`) REFERENCES `students` (`id`)
ON DELETE RESTRICT ON UPDATE CASCADE,
FOREIGN KEY(`enrollmenttype_id`) REFERENCES `enrollmenttypes` (`id`)
ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB;
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich ging durch eine ähnliche Sache im letzten Jahr. Es war die Frage: tun wir modellieren unsere Gesellschaften explizit oder allgemein? In deinem Beispiel würde das bedeuten, dass Entitäten/Tabellen, wie Lehrer, Schüler usw. mit direkten Beziehungen zwischen Ihnen oder nicht.
Am Ende gingen wir für eine generische "Partei-Modell". Die Party-Modell ist wie folgt:
Es ist ein extrem leistungsfähiges Modell, eine, die sehr verbreitet in CRM-Systeme. Dieses Modell ziemlich viel kam von "The Data Model Resource Book: Volume 1", das ist eine hervorragende Ressource für solche Dinge.
Den Gruppen und Mützen-Modelle, die Sie beschreiben, sind-Cabrio, einem zum anderen. Es gibt keine wirklichen sorgen über Datenverlust. Insbesondere der "master-Gruppen" Tabelle erzeugt werden kann, die von outer-joins von "Hut-person" Tabelle mit den verschiedenen "Hut " detail" - Tabellen.
Wenn Sie mit einem "Hut" - Modell müssen Sie stellen Sie sicher, dass Sie einen bestimmten "Hut-Tabelle" genau das sind die einzigartigen Eigenschaften dieses hat. Es gibt viel weniger Vergebung gibt, als mit dem Gruppen-Modell.
Werden Sie wahrscheinlich wollen, um set-up ein paar Ansichten für Allgemeine Aufgaben, wenn Sie diesen Weg gehen - zum Beispiel, wenn jemand die Eingabe in ein Feld für "Lehrer-Namen" und Sie wollen, um pop-up einige autocompletes, mit einem Blick, das ist im Grunde
wird enorm helfen.
Auf eine tangentiale Hinweis, eine Sache, die ich gefunden habe, um nützlich zu sein, ist der Aufruf Fremdschlüssel den gleichen Namen wie der Primärschlüssel in Ihrer ursprünglichen Tabelle. Auf diese Weise können Sie nur
in Ihr AUS, statt monkeying mit WO oder äquivalenzen.
Sind die Lehrer die einzige 'person', die eine rate zahlen? Sie können beschränken Sie Ihre design-by-doing es auf diese Weise. Was möchten Sie vielleicht zu tun haben, ist ein Attribute-Tabelle speichert zusätzliche Attribute für eine 'person'. Dies ermöglicht für zukünftige änderungen.
Ich mag den Hut Ansatz. In der Vergangenheit, ich implementiert eine Kombination von hüten und Gruppen. Grundsätzlich gibt es eine Liste aller möglichen Maßnahmen (Berechtigungen) ein Benutzer tun kann. Dann habe ich eine Tabelle von Gruppen. Jede Gruppe kann 1 oder mehrere Aktionen (Berechtigungen). Ich habe dann die Zuordnung von Benutzern zu Gruppen.
Dieser bietet mir eine Menge Flexibilität. Ich kann das sehr feine Korn in meiner permissioning. Ich kann auch die änderung vieler Völker Berechtigungen schnell nur durch Bearbeiten der Gruppe. In der Tat, ich habe die permissioning Seite einrichten verwenden die gleichen Berechtigungen. Dies ermöglicht es dem Endbenutzer (nicht von mir), um das setup Berechtigungen für andere Benutzer.
ja, die Lehrer sind nur Menschen, die eine rate zahlen als solche. Das Feld sollte genauer aufgerufen werden "classPayRate" - es ist ein Sonderfall für die Lehrer Mitarbeiter. Nicht-Lehrer-Mitarbeiter reichen Ihre Gesamtzahl der Stunden, als ein gesonderter posten in unserem payroll-system.
Könnte ich ändern, Lehrer, Mitarbeiter hinzufügen und Mitarbeiter geben.
Jedoch in keiner Weise oder form, würde ich immer speichern, E-Mail, Adresse, Telefonnummer in der person-Tabelle. Diese sollten alle einzelnen Tischen Ihre eigenen Leute haben mehrere E-Mail Adressen (Arbeit und privat), mehrere Telefonnummern (Arbeit, zu Hause, Zelle, fax) und mehrere Adressen (Arbeit, home1, home 2, Schule, etc.). Ich würde jeder an seinem eigenen Tisch, und mit einem Typ versehen werden, um es so können Sie ermitteln, welche ist, welche Art von Adresse, Telefon, etc.
Auch für Adresse, E-Mail, Telefon, möchten Sie vielleicht eine fahne zu identifizieren, die den Haupt-Datensatz verwenden Sie für die Kontaktaufnahme ersten. Wir cal unsere Korrespondenz, und es ist ein boolescher Wert, der gehalten ist up-to-date mit einen trigger als jede person, die ein record muss eine und nur eine Korrespondenz, so dass, wenn es Veränderungen, die alte darf automatisch zurückgestellt werden, sowie die neue one-in gehen und wenn es der erste Datensatz eingestellt ist automaticially und wenn die Korrespondenz reciord gelöscht wird , wird es zugeordnet zu den anderen, wenn dieser verbleibenden Datensätze.
Für die Sicherheit, die ich lieber benutze Access Controls Lists (ACLs). Mit ACL ' s haben Sie die Principals (Benutzer, Gruppen, oder der Benutzer), den Ressourcen (zum Beispiel eine Datei, einen Datensatz oder eine Gruppe von Datensätzen) und Aktionen (wie Lesen, aktualisieren, löschen).
Standardmäßig niemand hat das Privileg. Die Erteilung einer Erlaubnis können Sie einen Eintrag wie Bob Gelesen hat, der Zugriff auf die Datei Abc.
Sollten Sie in der Lage sein, um nach code zu suchen, der hilft, Sie umzusetzen so etwas wie dieses. In Java ist der JAAS unterstützt diese Methode.
Ich bin mit einer ACL-Paket für fein abgestufte Berechtigungen auf die Website - das Herzstück meine Frage ist mehr über, wie der zum speichern der Metadaten für Personen, die verschiedene Rollen und bauen Sie ein paar Sicherheitsvorkehrungen in das system für die Daten-Integrität (so dass eine person muss einen Lehrer aufnehmen, um festgelegt werden, als der Lehrer der Klasse, der foreign key-Einschränkung verweist auf die Lehrer-Tabelle, nicht die Tabelle person).
Ich verwendet-Party-Modell vor. Ich wirklich löst die meisten der Mängel.