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 eigene 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 besser geeignet 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 Post Lösung, würden Sie eine Tabelle so etwas wie diese (psuedocode - das ist wahrscheinlich nicht gültig DDL) haben:
create table Users {
id int auto_increment,
name varchar(200)
post text[][],
}
Mit verknüpften Tabellen, Sie so etwas wie
create table Users {
id int auto_increment,
name varchar(200)
}
create table Posts {
id auto_increment,
user_id int,
content text
}
tun würden
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 der separaten Tabelle de Zeichen, können Sie die ActiveRecord (oder welches objektrelationale System, das Sie verwenden) Werkzeuge für diese verwenden, die Ihren Code viel einfacher halten sollten.
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. Als Beispiel alle Beiträge von ‚Bob‘ mit Active bearbeitet finden, würden Sie brauchen nur:
Editor.where(name: 'Bob').posts
Für die Seite eingebettet sind, würden Sie Code schreiben müssen durch jeden Benutzer in der Datenbank zu gehen, analysieren jeden ihrer Beiträge und suchen Sie im Editorfeld nach 'Bob'.
Leistung: Stellen Sie sich vor, Sie haben 10.000 Benutzer mit durchschnittlich 100 Posts. 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: Durch die Verwendung einer herstellerspezifischen Datenstruktur kann das Verschieben Ihrer Anwendung in eine andere Datenbank ein Problem darstellen. 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 von 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.
http://stackoverflow.com/questions/27257093/rails-use-serialized-attributes-or-belongs-to-association –
@LannyBose Nein, das ist eine andere Frage. Das ist über Serialisierung vs. has_many, und ich hätte dieses Problem nicht, weil ich ein mehrdimensionales Array verwenden würde. Diese Antwort wäre keine Antwort für mich, und die Frage ist anders als meine. – thesecretmaster
Ah ... Entschuldigung. :( –