Frage

Ich habe viele Web-Anwendungen getan, wo das erste, was Sie ist eine Benutzertabelle mit Benutzernamen auszukommen, Passwörter, Namen, E-Mails und alle anderen üblichen Treibgut. Mein aktuelles Projekt stellt eine Situation, in der nicht-Benutzer Datensätze müssen in ähnlicher Weise für die Benutzer funktionieren, müssen aber nicht auf die Fähigkeit, ein erster Ordnung Benutzer zu sein.

Ist es sinnvoll, eine zweite Tabelle, people_tb zu schaffen, dass das Haupt relationale Tabelle und Datenspeicher ist, und nur die users_tb für die Authentifizierung verwenden? Hat Trennung user_tb von people_tb Probleme präsentieren? Wenn dies häufig geschehen ist, was sind einige Strategien und Lösungen sowie Nachteile?

War es hilfreich?

Lösung

Dies ist sicherlich eine gute Idee, wie Sie die Datenbank zu normalisieren. Ich habe ein ähnliches Design in einer App getan, die ich schreibe, wo ich eine Mitarbeiter Tabelle und eine Benutzertabelle. Der Benutzer kann eine von einem externen Unternehmen oder einem Mitarbeiter, so habe ich separate Tabellen weil ein Mitarbeiter immer ein Benutzer ist, aber ein Benutzer kann kein Mitarbeiter sein.

Die Probleme, die Sie ausgeführt werden, in dass, wenn Sie die Benutzertabelle verwenden, werden Sie fast immer die Person Tabelle die Namen oder andere gemeinsame Attribute erhalten mögen Sie zeigen wollen würden.

Von einer Codierung Standpunkt, wenn Sie gerade SQL verwenden, wird es ein wenig mehr Mühe, um mental die select-Anweisung zu analysieren. Es kann ein wenig komplizierter sein, wenn Sie eine ORM-Bibliothek verwenden. Ich habe nicht genug Erfahrung mit denen haben.

In meiner Anwendung, ich schreibe es in Ruby on Rails, so dass ich ständig Dinge wie employee.user.name tun, wo, wenn ich sie zusammen gehalten, wäre es nur user.name employee.name oder wird.

Aus anwendungstechnischer Sicht, Sie schlagen zwei Tabellen anstelle von einem, sondern bei richtigem Indizes, sollte es unerheblich sein. Wenn Sie einen Index hatte, die den Primärschlüssel und den Personennamen enthalten sind, zum Beispiel die Datenbank der Benutzertabelle, dann den Index für die Personen-Tisch (mit einer nahezu direkten Treffer) treffen würde, so würde die Leistung fast das gleiche wie mit einer Tabelle.

Sie können auch einen Blick in der Datenbank erstellen beiden Tabellen halten zusammengefügt Ihnen zusätzliche Leistungsverbesserungen zu geben. Ich weiß, dass in den späteren Versionen von Oracle Sie sogar einen Index für eine Sicht setzen kann bei Bedarf die Leistung zu erhöhen.

Andere Tipps

ich routinemäßig, dass, weil für mich das Konzept der „user“ (Benutzername, Passwort, Erstellungsdatum, Datum der letzten Anmeldung) unterscheidet sich von „Person“ (Name, Adresse, Telefon, E-Mail). Einer der Nachteile, die Sie finden können, ist, dass Ihre Anfragen oft mehr verbindet benötigen die Informationen die Sie suchen zu bekommen. Wenn alles, was Sie haben ein Login-Name ist, müssen Sie den „Volk“ Tisch setzen, den Vor- und Nachnamen zum Beispiel zu bekommen. Wenn Sie alles rund um den Benutzer-ID Primärschlüssel stützen, ist dies ein wenig gemildert, aber immer noch erscheint.

Wenn user_tb Auth Info hat, wäre ich sehr viel halten Sie es von people_tb zu trennen. Ich würde halten jedoch eine Beziehung zwischen den beiden, und die meisten Nutzer Informationen würden in people_tb außer alle Infos für Auth erforderlich gespeichert werden (was ich denke, wird nicht viel verwendet werden sonst) Es ist ein schöner Kompromiss zwischen Design und Effizienz i denken.

Ich versuche immer, so viele Daten wie möglich Wiederholung zu vermeiden. Wenn nicht alle Menschen um sich einzuloggen, dann können Sie eine generische people Tabelle mit den Informationen, die sowohl für Menschen und Benutzer gelten (z. B. Vorname, Nachname, etc).

Dann gilt für Menschen, die sich anmelden, können Sie eine users Tabelle, die eine 1 ~ 1-Beziehung mit people hat. Diese Tabelle kann speichern Sie den Benutzernamen und das Passwort.

würde ich sagen, für das normalisierte Design gehen (zwei Tabellen) und nur denormalize (nach unten gehen, um einen Benutzer / Person-Tabelle), wenn es wirklich Ihr Leben leichter auf der ganzen Linie machen. Wenn jedoch praktisch alle Menschen Benutzer sind auch kann es einfacher sein Front denormalize auf. Es liegt an dir; Ich habe das normalisierte Ansatz ohne Probleme verwendet werden.

Sehr vernünftig.

Als Beispiel nehmen einen Blick auf die aspnet_ * Dienste Tabellen hier .

Die eingebaute Schema hat eine aspnet_Users und aspnet_Membership mit der späteren Tabelle mehr erweiterte Informationen über einen bestimmten Benutzer (gehasht Passwörter, etc.), die aber die aspnet_User.UserID wird in den anderen Teilen des Schemas für die referentielle Integrität usw. verwendet.

Unterm Strich ist es sehr häufig, und ein gutes Design, um Attribute in einer separaten Tabelle, wenn sie verschiedene Einheiten, wie in Ihrem Fall sind.

Das ist definitiv, was wir tun, wie wir Millionen von Menschen Aufzeichnungen und nur Tausende von Benutzern haben. Wir trennen auch Adresse, Telefon und E-Mails in relationalen Tabellen so viele Menschen mehr als ein jedes dieser Dinge. Critial ist nicht auf Namen zu verlassen, wie der Bezeichner als Name nicht eindeutig ist. Stellen Sie sicher, dass die Tabellen durch irgendeine Art von Ersatzschlüssel verbunden (eine ganze Zahl oder eine GUID ist vorzuziehen) nicht nennen.

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