Warum in der Welt hätte ich viele Beziehungen?

8

Ich bin gerade auf eine interessante Situation bezüglich Beziehungen und Datenbanken gestoßen. Ich schreibe eine Ruby-App und für meine Datenbank verwende ich postgresql. Ich habe ein Elternobjekt "Benutzer" und ein verwandtes Objekt "Dings", wo ein Benutzer ein oder mehrere Dinger haben kann. Was wäre der Vorteil der Verwendung einer separaten Tabelle gegenüber dem Einbetten von Daten in ein Feld in der übergeordneten Tabelle?

Beispiel von ActiveRecord:

unter Verwendung einer verwandten Tabelle:

%Vor%

verwendet eine eingebettete Datenstrukturmethode (multidimensionales Array):

%Vor%

Relevante Informationen

Ich benutze Heroku und Heroku-Posgres als meine Datenbank. Ich verwende ihre freie Option, die mich auf 10.000 Zeilen beschränkt. Dies scheint mich dazu zu bringen, den multidimensionalen Array-Weg zu benutzen, aber ich weiß es nicht wirklich.

    
thesecretmaster 21.10.2015, 22:20
quelle

4 Antworten

11

Das Einbetten einer Datenstruktur in ein Feld kann in einfachen Fällen funktionieren, verhindert jedoch, dass Sie relationale Datenbanken ausnutzen. Relationale Datenbanken sind darauf ausgelegt, Ihre Daten zu finden, zu aktualisieren, zu löschen und zu schützen. Mit einem eingebetteten Feld, das seine eigenen wad-o-Daten (Array, JSON, XML usw.) enthält, schreiben Sie den gesamten Code, um dies selbst zu tun.

Es gibt Fälle, in denen das eingebettete Feld geeigneter sein könnte, aber für diese Frage werde ich als Beispiel einen Fall verwenden, der die Vorteile einer verwandten Tabelle aufzeigt.

Stellen Sie sich ein Benutzer- und Post-Beispiel für ein Blog vor.

Für eine eingebettete Postlösung hätten Sie eine Tabelle in etwa so (psuedocode - das sind wahrscheinlich keine gültigen ddl):

%Vor%

Mit verwandten Tabellen würden Sie etwas wie

tun %Vor%

Object Relational Mapping (ORM) -Tools : Mit dem eingebetteten Post schreiben Sie den Code manuell, um einem Benutzer Posts hinzuzufügen, durch vorhandene Posts zu navigieren, sie zu validieren, zu löschen usw. Mit Durch das separate Tabellen-Design können Sie das ActiveRecord-Werkzeug (oder ein anderes objektbezogenes System, das Sie verwenden) für diesen Zweck nutzen, um Ihren Code viel einfacher zu halten.

Flexibilität : Stellen Sie sich vor, Sie möchten dem Beitrag ein Datumsfeld hinzufügen. Sie können dies mit einem eingebetteten Feld tun, aber Sie müssen Code schreiben, um Ihr Array zu analysieren, die Felder zu validieren, die vorhandenen eingebetteten Beiträge zu aktualisieren usw. Mit der separaten Tabelle ist dies viel einfacher. Nehmen wir einmal an, Sie möchten Ihrem System einen Editor hinzufügen, der alle Beiträge genehmigt. Mit dem relationalen Beispiel ist das einfach. Um beispielsweise alle Beiträge zu finden, die von 'Bob' mit ActiveRecord bearbeitet wurden, benötigen Sie nur:

%Vor%

Für die eingebettete Seite müssten Sie Code schreiben, um jeden Benutzer in der Datenbank durchzugehen, jeden ihrer Beiträge analysieren und im Bearbeitungsfeld nach 'Bob' suchen.

Leistung : Stellen Sie sich vor, dass Sie 10.000 Benutzer mit durchschnittlich 100 Posts haben. Jetzt möchten Sie alle Beiträge finden, die an einem bestimmten Datum gemacht wurden. Mit dem eingebetteten Feld müssen Sie jeden Datensatz durchlaufen, das gesamte Array aller Posts parsen, die Daten extrahieren und den gewünschten Datensatz überprüfen. Dies wird sowohl cpu und Festplatte i / 0 kauen. Für die Datenbank können Sie einfach das Datumsfeld indizieren und die exakten Datensätze herausziehen, die Sie benötigen, ohne jeden Beitrag von jedem Benutzer zu analysieren.

Standards : Wenn Sie eine herstellerspezifische Datenstruktur verwenden, kann das Verschieben Ihrer Anwendung in eine andere Datenbank sehr mühsam sein. Postgres scheint eine Vielzahl von Datentypen zu haben, aber sie sind nicht identisch mit MySQL, Oracle, SQL Server usw. Wenn Sie bei Standarddatentypen bleiben, werden Sie viel leichter Backends austauschen können.

Das sind die Hauptprobleme, die ich oben sehe. Ich habe diesen Fehler gemacht und den Preis dafür bezahlt, also wenn es keinen überzeugenden Grund gäbe, würde ich den separaten Tisch benutzen.

    
jpgeek 25.10.2015 13:20
quelle
2

Was ist, wenn die Benutzer John und Ann die gleichen Dinge haben? Die Datensätze werden dupliziert, und wenn Sie sich entscheiden, den Namen der Sache zu ändern, müssen Sie zwei oder mehr Datensätze ändern. Wenn in der separaten Tabelle etwas gespeichert ist, müssen Sie nur einen Datensatz ändern. FYI Ссылка

    
yurko 26.10.2015 10:16
quelle
2

Vorteile von eins zu vielen:

  1. Einfachere ORM (Object Relational Mapping) -Integration. Sie können es in beide Richtungen verwenden, aber Sie müssen Ihre Tabellen mit nativen SQL definieren. Unterschiedliche Tabellen sind einfacher und Sie können automatisch generierte Zuordnungen verwenden.
  2. Ihre Speicherplatzbeschränkung von 10.000 Zeilen wird weiter mit der Eins-zu-viele-Beziehung gehen, falls 2 oder mehr Personen die gleichen "Dings" haben können.
  3. Behandle Benutzer und Dinger getrennt. In einigen Fällen interessieren Sie sich vielleicht nur für Menschen oder Dinger, nicht für ihre Beziehung zueinander. Einige Beispiele, um einen Benutzernamen oder eine Beschreibung zu aktualisieren, um eine Liste aller Dings (oder aller Benutzer) zu erhalten. Die Auswahl aus der einzelnen Tabelle kann die Zusammenarbeit erschweren.
  4. Wartung und Manipulation ist einfacher. Für den Fall, dass ein Benutzer oder ein Ding aktualisiert wird (Namensänderung, Aktualisierung der E-Mail-Adresse usw.), müssen Sie nur einen Datensatz in ihrer Tabelle aktualisieren, anstatt Updateanweisungen zu schreiben "where user_id =?".
  5. Durchsetzbare Datenbankeinschränkungen Was ist, wenn ein Ding niemandem gehört? Ist die Benutzerspalte jetzt nillable? Es müsste im Einzelfall sein, also könnten Sie beispielsweise keinen einfachen "nicht nillierbaren" Benutzernamen erzwingen.

Es gibt natürlich viele Gründe. Wenn Sie eine relationale Datenbank verwenden, sollten Sie die one to many verwenden, indem Sie Ihre Objekte (Benutzer und Din- ges) als separate Tabellen aufteilen. Wenn Sie die Begrenzung der Anzahl der Datensätze berücksichtigen und die Größe Ihres Datasets klein ist (unter 10.000), sollten Sie die Nachteile von normalisierten Daten nicht spüren.

Die kurze Wahrheit ist, dass beide Vorteile haben. Sie könnten zum Beispiel schnellere Lesezeiten aus dem Single-Table-Ansatz bekommen, weil Sie keine komplizierten Joins benötigen.

Hier ist eine gute Referenz mit den Vor- und Nachteilen von beiden (normalisiert ist der Multiple-Table-Ansatz und denormalisiert ist der Single-Table-Ansatz). Ссылка

    
user1661071 26.10.2015 12:36
quelle
1

Neben den anderen erwähnten Vorteilen gibt es auch eine Sache über Standards. Wenn Sie alleine an dieser App arbeiten, ist das kein Problem, aber wenn jemand anders etwas ändern möchte, dann beginnt der Albtraum. Es kann dauern, bis dieser Typ viel Zeit hat zu verstehen, wie es alleine funktioniert. Und so etwas zu verändern, wird noch mehr Zeit in Anspruch nehmen. Auf diese Weise kann eine einfache Verbesserung sehr zeitaufwendig sein. Und irgendwann wirst du mit anderen Leuten arbeiten. Also immer wie der Typ, der am Ende mit deinem Code arbeitet, ist der brutale Psychopath, der weiß, wo du lebst.

    
ZebThan 30.10.2015 11:51
quelle