Frage

In jedem Tutorial, das ich über Multitenant -Datenbankmodelle gesehen habe, werden Sie den Mieter in jeder einzelnen Tabelle einsetzen:

zoos
-------
id
zoo_name
tenant_id

animals
-------
id
zoo_id
animal_name
tenant_id

Dies scheint mir jedoch überflüssig. Warum nicht die hinzufügen tenant_id Spalte nur die zoos Tabelle und nutze die fremde Schlüsselbeziehung zwischen zoos und animals?

Fügen Sie hinzu tenant_id Zu jedem Tisch, um zu verhindern, dass die Verbindungen zu verrückt werden? Ist es ein Schutz vor Bugs? Eine Leistungsbeachtung?

War es hilfreich?

Lösung

Wenn ich Mieter an der Spitze der Hierarchie hatte (dh auf Zooebene), haben Sie mehrere Probleme zu berücksichtigen.

  1. Die Oberseite der Hierarchie kann sich nie ändern, beispielsweise wenn Sie einen Knoten auf dem Baum über der Zooebene hinzufügen müssen (z. B. Regionen -> Zoos -> Tiere), dann erzwingt er jedes Mal einen erneuten Organisation.
  2. Für bestimmte Fragen werden Sie gezwungen sein, oben in der Hierarchie zu beginnen. Wenn Sie mir eine Liste aller verfügbaren Tiere geben, zwingen Sie, oben auf dem Baum zu beginnen
  3. Warum nicht Schemas verwenden? Jeder Mieter ist in seinem eigenen Schema isoliert. Dies wird auch die Datensätze gut trennen.

Andere Tipps

Wenn eine Ihrer wichtigsten Überlegungen zur Entwurfssicherheit ist, kann ein Kunde nicht nein, wie nein, wenn der Zugriff auf die Daten eines anderen Kunden-danach, je nachdem, wie Sie diese Sicherheit implementieren, kann es erforderlich sein, diese Qualifikationsspalte in jeder Tabelle zu kleben. Eine solche beschriebene Taktik hier erfordert einen Blick auf jeden Tisch aufzubauen; Unter der Annahme, dass jede Tabelle eine Mieterspalte enthält, kann bei ordnungsgemäß konfigurierter Ansicht eine Klausel "wobei TenantID = suser_sid ()" enthalten sein kann (und natürlich konfigurieren Sie die Datenbank, damit Clients nur auf die Ansichten zugreifen können).

Ein weiterer Faktor (wie in meinem aktuellen Job) ist das Laden von Warehouse -Daten (ETL). Die Tabellen werden auf Tenantis verteilt (wir verwenden die Tabellenpartitionierung, partitionierte Ansichten würden jedoch auch funktionieren), und Daten können für einen Kunden leicht geladen oder entladen werden, ohne sich ernsthaft zu beeinflussen.

Aber wie immer gibt es eine Menge "es hängt davon ab" involviert. Wenn es keinen klaren und gegenwärtigen Bedarf gibt, und Eine sehr geringe Wahrscheinlichkeit eines zukünftigen Bedürfnisses, dann normalisieren Sie diese Säule. Erkenne nur, dass es eher eine Auseinandersetzung mit der physischen Implementierung als mit konzeptionellem oder logischem Datenbankdesign ist.

Es ist für Bequemlichkeit und Leistung da - in Bezug auf die Normalisierung sind Sie absolut Recht, es muss nur an der Spitze gehen. Das Problem ist dann, dass Sie zu einigen Daten (z. B. Zoo -> Tier -> Lebensmittel -> Lieferant), dass Sie schrecklich komplexe Zusammenhänge zu den faszinierten, sehr einfachen Abfragen haben müssen.

In der realen Welt muss man also Kompromisse eingehen - die Frage wird dann wo und inwieweit.

Siehe diesen Artikel Vielleicht ist die Normalisierung nicht normal - und seine Schlussfolgerung:

Wenn das alte Sprichwort geht, normalisieren Sie, bis es weh tut, denormalisieren Sie, bis es funktioniert

als Ort, um das Thema zu erkunden

Das erste, was ihm in den Sinn kommt, ist, dass es langsamer ist, nachzuschlagen animals > zoos > tenants als einfach animals > tenants. Und höchstwahrscheinlich ist dies eine Suche, die Sie tun werden häufig (Zum Beispiel "Holen Sie sich alle Tiere für einen bestimmten Mieter, unabhängig vom Zoo").

Bei kleinen bis mittelgroßen Anwendungen können Sie mit einer normalisierteren Struktur davonkommen, aber aus Gründen der Effizienz sollten Sie mit fremden Daten entsprechen (und im Allgemeinen sind Multitenancy-Anwendungen nicht gering). Stellen Sie einfach sicher, dass es nicht "aus Synchronisation" geht, was ein Risiko darstellt, das mit überfliegenden Daten einhergeht.

Um Ihren letzten Absatz zu beantworten, ist der Grund, warum es nur rein und einfach ist. Joins sind keine schlechte Sache; Sie helfen Ihnen, ein Datenstück an einem Ort und nicht an drei zu halten. Es ist definitiv nicht, Fehler zu verhindern. Hinzufügen a tenant_id Feld zu mehr Tabellen erhöht das Risiko von Fehler (obwohl es für eine ID, die sich nie ändert, nicht so ein Problem wäre).

Nun, Bob kann eine Giraffe im Zoo No1 besitzen, während Joe einen Löwen im selben Zoo besitzt. Sie sollen die Daten der anderen nicht betrachten.

Der Grund, warum N1 für die Sicherheit ist.

Die Sicherheit muss ein starkes Konzept in der Anwendung mit mehreren Mietern sein.

Angenommen, Sie geben einem Benutzer die Möglichkeit, ein Tier zu ändern. Sie erstellen eine Form, die eine Auswahl erstellt, die den Zoo für den aktuellen Mieter anzeigt. Was passiert, wenn der Benutzer das Formular hackt und eine Zoo -ID eines anderen Mieters passt?

Das Tier wird in einen anderen Zoo eines anderen Mieters verlegt !!

Dies ist echter Schmerz in einer Multi -Mieter -App!

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