Datenbanknormalisierung im Vergleich zu Abhängigkeiten

8

Ich entwickle 3-4 voneinander abhängige Programme. Nennen Sie sie foo bar baz und auth. Ich möchte, dass sie unabhängig voneinander sind. Stellen Sie sich vor, ich würde jedes Programm an andere Unternehmen lizenzieren. Einige Unternehmen möchten möglicherweise Foo und Bar, andere möchten möglicherweise nur Baz usw. Es scheint auch eine gute Praxis zu sein, die Authentifizierung auch unabhängig zu halten.

Kontext: auth kümmert sich um die Authentifizierung für alle Systeme. Die Hauptbenutzertabelle in auth enthält user_id, email, password, first, last

foo hat auch eine Benutzertabelle, die bestimmte Felder für die Anwendung enthält: Benutzer-ID, Rollen-ID usw.

Jedes System verfügt über eine eigene Datenbank. In der Vergangenheit habe ich von jeder Anwendung einen Fremdschlüssel für die Auth-Datenbank erstellt. Ich habe Aktualisierungsberechtigungen aus den anderen Datenbankbereichen entfernt, aber ausgewählten Zugriff auf bestimmte relevante Felder gewährt. Dies scheint eine schlechte Lösung zu sein, da dadurch eine enge Abhängigkeit entsteht, aber ich konnte die Datenbank normalisieren, sodass ich den Benutzernamen und die E-Mail-Adresse nicht in den Datenbanken foo, bar oder baz speichern musste.

Wäre es besser, die Informationen in allen Datenbanken zu speichern? Oder wäre es besser, die Auth-ID in foo bar und baz zu speichern und eine API zu verwenden, um die Benutzerinformationen mithilfe der authId abzurufen?

Ebenso könnte ich Kunden in allen 3 Systemen haben. Sicher, es scheint schlecht, eine Abhängigkeit in eine Authentifizierungsdatenbank zu erstellen, aber was ist mit den Kundendatenbanken in allen drei?

Oder ist die beste Lösung, um eine zentrale Datenbank zu haben. Eine Benutzertabelle.

Geben Sie hier die Bildbeschreibung ein

Andere Vorschläge?

Ajon
quelle
2
Sie sagen, es scheint eine gute Praxis zu sein, 'auth' auch unabhängig zu halten, aber die anderen Programme können auch ohne auth ausgeführt werden. Was passiert, wenn sich zwei der Programme und nicht auth auf einem System befinden? Wie wird die Authentifizierung durchgeführt? Diese Beziehung wird bestimmen, wie eng die Authentifizierung mit den anderen Prozessen verbunden ist und wie die Daten als solche strukturiert werden sollten.
Gerald Davis
foo barBeispiele sind oft zu abstrakt, um gute Illustrationen zu sein.
Robert Harvey

Antworten:

4

Wenn Sie 4 unabhängige Dienste haben, müssen diese unabhängig sein. In gemeinsamen DBs oder ähnlichem sollten keine Daten geteilt werden, da Sie sie dann einfach abhängig machen!

Während es in Ordnung ist, eine einzelne Datenbank in der Produktion gemeinsam zu nutzen, sollten die Dienste ihre eigenen Schemas verwenden, da die Datenbank nur als gemeinsamer Container vorhanden ist, ähnlich wie ein einzelner Linux-Server alle vier Dienste ausführen kann.

Jeder Dienst sollte über eine eigene API verfügen. Dies ist die einzige Möglichkeit, Daten in die einzelnen APIs hinein- und herauszuholen. Ihr Authentifizierungsdienst speichert also Benutzer und führt die Authentifizierung durch, gibt jedoch ein Token zurück, um einen Benutzer zu identifizieren. Dieses Token wird von den anderen Diensten verwendet, um sich zu merken, welcher Benutzer welcher ist. Andernfalls sollten sie überhaupt keine Kenntnisse über die Benutzerauthentifizierung haben.

Der einfachste Weg, diese zu implementieren, besteht darin, zu überlegen, was Sie tun würden, wenn Sie einen Dienst eines Drittanbieters anstelle des von Ihnen geschriebenen verwenden würden - wenn Sie den OpenID-Dienst von StackExchange für Benutzer anstelle Ihres eigenen verwenden würden. Wenn Sie dies in Ihrer Architektur ersetzen können, haben Sie ein gutes, unabhängiges Design.

gbjbaanb
quelle
2

Ihr Beispiel ist etwas abstrakt, aber lassen Sie mich meine Gedanken durchgehen.

Option A: Nach meiner Erfahrung ist dies unabhängig von Ihren Gründen immer schlecht. Sicher, DBs wie MSSQL können Friend-Datenbanken usw. haben, aber wenn die Daten verknüpft sind, sollten sie sich in derselben DB befinden

Option B: Sie sind sich nicht sicher, was hier vor sich geht? Sie fügen eine API hinzu, die alle DBs abfragt und die Ergebnisse zusammenführt. Das ist besser, aber wenn Sie Apps über dieser API haben, dann ist dies Teil der Datenschicht für sie und sie verwenden wirklich nur eine der DBs. Warum haben sie dann die anderen in ihrer Datenschicht?

Option C: Nun, das funktioniert, aber es ist nicht gut, eine große Datenbank mit nicht verwandten Daten zu haben. Sie möchten, dass die Programme unabhängig voneinander sind, oder? das hilft nicht dabei.

Option D.

Mein Vorschlag ist, die Authentifizierung vom Konzept der Benutzer-ID zu abstrahieren. Ihre Auth-App sollte sich mit Benutzern und Rollen befassen (oder Versprechen usw., wenn Sie ganz modern sind). Diese Daten sollten in der Auth-Datenbank vorhanden sein

Jede App muss über eine Benutzer-ID verfügen, um Daten nach Benutzer zu gruppieren. Einige verwandte Daten müssen den Authentifizierungsaufruf ausführen und den Benutzer gegenüber Menschen identifizieren. Dies wäre die Benutzer-ID (eindeutig für die App), der tatsächliche Name, der Benutzername und der zu verwendende Authentifizierungsdienst. Diese Daten sollten in der Apps-Datenbank vorhanden sein

Die Datenbanken sollten keine Verbindung zwischen ihnen haben. Konzeptionell sollten Sie Facebook als Authentifizierungsdienst anstelle Ihrer Authentifizierungs-App verwenden können

Möglicherweise benötigen Sie weitere Benutzerverknüpfungsinformationen, wenn Sie einen foo-Benutzer mit einem Balkenbenutzer verknüpfen möchten

Ewan
quelle
0

Ich würde empfehlen, Single Sign On (SSO) zu implementieren, beispielsweise mit LDAP. Ihre größeren Kunden hätten wahrscheinlich auch davon profitiert, da sie Ihre integrierte Authentifizierungs-App durch ihre eigene vorhandene Benutzerdatenbank ersetzen könnten. Für Ihre kleineren Kunden, die SSO nicht unterstützen, können Sie die Bereitstellung vereinfachen, indem Sie Ihre App mit einer Standardauthentifizierungs-App ausliefern.

Lie Ryan
quelle