Erstellen Sie eine Benutzertabelle für die einmalige Anmeldung, die über Subdomains hinweg verwendet werden soll

8

Wir haben eine Website mit Subdomains wie:

  1. example.com - Hauptseite
  2. food.example.com
  3. fashion.example.com

Und jede Domain und Subdomain hat eine andere Datenbank, so:

  1. BeispielDB - Haupt-DB mit Benutzer Tabelle
  2. foodDB
  3. fashionDB

Was haben Sie versucht?

  1. Im Moment haben wir für die einmalige Anmeldung geplant, Benutzer auf unserer Hauptseite umzuleiten, um sich anzumelden.

  2. Während die Auftragsbearbeitung in Sub-Domains die UserID von der Haupt-DB bezieht und in der Orders-Tabelle der jeweiligen Sub-Domain speichert.

  3. Zu Berichtszwecken speichern wir UserID ohne FK constraint in der Tabelle Orders , da wir eine separate Datenbank haben.

Ich kann hier Benutzer Tabellen auch?

Wird das StackExchange-Netzwerkprofil in einer separaten Datenbank gespeichert?

Ich sehe hier Die Benutzertabelle jeder Site hat AccountId des StackExchange-Netzwerkprofils.

Ein Beispiel:

  1. Hier ist Nick Craver Netzwerkprofil mit der ID: 7598

  2. Sein Profil in der History-Site hat eine Account-ID, die mit derselben ID verknüpft ist: 7598 check this Abfrage.

Ich kann die Accounts -Tabelle nirgends in dumbs anzeigen , also wurde AccountId gespeichert? Und wie wird SSO an mehreren Standorten mit AccountId ?

ausgeführt?

Meine Frage: Brauchen wir eine einzelne Benutzertabelle in der Main DB oder müssen wir separate Benutzertabellen für die Datenbank der Subdomain und Link Main DB UserID , aber nicht FK constraint erstellen? Welches ist das beste Design für eine Shopping-Site?

Jede Hilfe wäre großartig.

    
stom 26.05.2016, 08:35
quelle

4 Antworten

4

Die von Ihnen erwähnte Benutzer-ID ist nur in einer bestimmten Benutzertabelle in einer einzelnen DB identisch. Es ist eigentlich kein Bezeichner für einen Nutzer in Ihrer Domain. Um Benutzer in mehreren Datenbanken zu identifizieren, benötigen Sie für jeden Benutzer eine ID auf Domänenebene. Eine einfache Möglichkeit besteht darin, der Benutzerklasse (Tabelle) eine weitere Eigenschaft (Spalte) mit der Bezeichnung UID oder etwas Ähnliches hinzuzufügen, nämlich die globale eindeutige ID (GUID), siehe Ссылка ) und verwenden Sie sie als ID auf Domänenebene, um Benutzer anstelle von UserId zu identifizieren. Auf diese Weise können Sie Benutzerinformationen in mehreren Datenbanken in Ihrer Domäne frei speichern. Also:

  • Sie können nur die ID auf Domänenebene in jeder Subdomain-Datenbank speichern und diese ID verwenden, um vollständige Benutzerprofile aus der DB der Hauptdomäne abzufragen. Vorteile: kostet weniger Speicher. Kompromiss: In einem verteilten System dauert es länger, Benutzerinformationen aus der Unterdomäne abzufragen, da sich die Informationen in der Hauptdatenbank befinden.
  • Sie können die vollständigen Benutzerinformationen in der gesamten DB speichern, einschließlich Haupt- und Nebenstellen. Pro: schnellere Abfragen. Nachteile: kostet mehr Speicher und wenn sich eine Benutzerinformation ändert, müssen Sie sie über alle Datenbanken hinweg synchronisieren.
Robo 24.06.2016 17:20
quelle
1

1] Sie müssen eine separate Benutzertabelle in allen drei Datenbanken haben, da es keine referenzielle Integrität des Fremdschlüssels gibt. Wenn eine Datenbank ausfällt, werden andere Domänen ausgeführt. Die Datenbankverwaltung benötigt mehr Wartung aber Leistung wird nicht behindern.

Alternativ können Sie den folgenden Datenbankplan erstellen.

1] Behalten Sie eine Datenbank für alle drei Domänen (eine Hauptdomäne und zwei Unterdomänen)

2] Erstellen Sie eine Benutzertabelle mit zwei Status-Flags für food_order, fashion_order

3] Erstellen Sie eine Auftragstabelle für Lebensmittel und Mode separat

4] Es gibt drei Möglichkeiten, dass Benutzer bestellen i) Essen oder ii) Mode oder iii) Essen / Mode beide.

5] Aktualisiere Statusflagge wie auf Bestellung entweder Essen oder Mode oder Essen / Mode beide.

Hier ist der Kompromiss: Wenn Ihre Datenbank ausfällt, geht Ihre gesamte Website aus. So behalten Sie ein sehr gutes Disaster-Recovery-Modell der Datenbank bei.

    
Bavishi PN 26.05.2016 12:45
quelle
1

Einige Optionen:

  1. Speichern Sie Ihre Benutzer nur in der Hauptdatenbank. Dann ...

    • Verwenden Sie ein verschlüsseltes Cookie, um alle Benutzerinformationen zu speichern, die Ihnen wichtig sind. Dieser Cookie wäre für alle anderen Subdomains lesbar.
    • ODER speichern Sie die user_id nur im Cookie und verwenden Sie die Back-Channel-Kommunikation über eine API, um die Benutzerinformationen von der Hauptseite zu erhalten.
    • ODER verwenden Sie eines der vielen bestehenden Standardnutzerprotokolle für die gemeinsame Nutzung von Benutzerinformationen, um Benutzerinformationen in die anderen Standorte zu übertragen, wo Sie sie dann im aktuellen Sitzungsspeicher speichern können. Einige Beispiele umfassen CAS und OAuth.
  2. Speichern Sie Ihre Benutzerinformationen in allen DBs. Normalerweise erhalten Sie die Informationen zu den anderen DBs mit einem der ...

    • regelmäßig geplanter Synchronisierungsjob
    • Rückkanal-Kommunikation, wenn sich der Benutzer anmeldet
    • eines der Standard-Protokolle zum Austausch von Benutzerinformationen (wie oben)

Mit Option 1 würde Ihre Haupt-DB alle anderen Websites beeinträchtigen. Mit Option 2 sind die Nicht-Haupt-DBs ziemlich im Cache gespeicherte Kopien, und Sie müssen mit der Ungültigmachung des Cache umgehen.

Welche Option Sie auswählen, hängt hauptsächlich von Ihren spezifischen Geschäftsanforderungen ab.

    
memimomu 27.06.2016 20:04
quelle
0

Ich denke, wie Sie in Ihrer Frage angefangen haben, ist Ihre beste Wette.

Am besten ist es, wenn Sie eine Benutzertabelle und drei Konfigurationstabellen haben. Die Tabelle "one users" wird mit der SSO-Funktionalität verknüpft, mit der Benutzer, ihr gesamtes Profil und ihre Anmeldeinformationen überprüft werden. Jeder Dienst / jede Website, die / der für die Domäne irrelevant ist, die das SSO des Verbunds verwendet und die Cookies des Benutzers überprüft. I.e. tue so, als wäre alles gleich, außer dass du Google Web Federation für SSO verwendest. Die Daten, die in Google gespeichert sind, interessieren Sie nicht wirklich (außer vielleicht gibt es Feld, das Sie tun, möglicherweise Benutzername, usw.). Egal, in welcher Domäne Sie sich befinden, die erste Sache, die Sie tun, ist, einen Anruf zu SSO zu machen und sehen, ob der Benutzer bereits angemeldet ist, wenn sie nicht direkt dort sind, und wenn sie fertig sind, erhalten sie eine Weiterleitung zurück zu Ihrer Subdomain.

Wenn sie eingeloggt sind, dann keine Weiterleitung, aber Sie erhalten das JWT-Token, das die Umwandlung von gespeicherten userIds (oder UID) in tatsächliche Informationen ermöglicht.

Sagen Sie zum Beispiel, dass ein eingeloggter Benutzer etwas von fashion.example.com kauft. Sie könnten Ihrer Tabelle orders eine Zeile hinzufügen, die zufällig eine Spalte namens "userId" enthält. Wenn diese Site auf der Startseite "Benutzer X bestellte Y" veröffentlichen möchte, nachdem Sie die Bestellung aus der Tabelle erhalten haben, rufen Sie den SSO-Dienst an, um ein JWT mit den Benutzerinformationen mithilfe des SSO-Tokens abzurufen. Wenn Sie aus irgendeinem Grund eine Konfiguration speichern möchten, die sich nach Subdomäne unterscheidet, erstellt diese Subdomain ihre eigene Tabelle "users" oder "configuration", und der Schlüssel wird mit der UID im SSO-Dienst verknüpft. Ob es eine eindeutige PK gibt, bleibt Ihnen überlassen (mit einem FX zur UID) oder wenn die PK die UID ist.

Damit können Sie die Domains vollständig voneinander trennen. Und lassen Sie Ihre Subdomain entscheiden, ob sie eine Tabelle "Benutzer" benötigt oder nicht.

TL; DR. Sie haben wirklich 4 Domains, nicht 3, behandeln sie als 1 SSO Authentifizierungsdomain und 3 Sites. Das SSO verfügt über die Authentifizierungstabelle, und jede Standortdomäne kann ggf. eine eigene Benutzertabelle haben. Diese Benutzertabelle würde einen FK für die SSO-Tabelle haben, ohne dass eine FX-Einschränkung durchgesetzt werden muss. (FK Constraint, wenn irgendwie durchgesetzt werden könnte, wäre tatsächlich schlecht, weil Sie nicht wollen, dass ein SSO-Dienst über die Subdomains wissen muss, wenn ein Benutzerkonto gelöscht werden sollte, die Tatsache, dass diese alle verschiedene Datenbanken sind, ist schon genial. )

    
Warren Parad 28.06.2016 03:50
quelle