2016-05-04 13 views
1

Ich arbeite an einer Anwendung und ihr Hauptzweck ist es, andere Benutzer basierend auf ihren Präferenzen und basierend auf ihrer Persönlichkeit zu empfehlen (jede Empfehlung wird separat behandelt). Was gilt als eine gute Praxis? Um Informationen in 3 getrennten Tabellen (users, user_preferences und user_details) zu speichern oder eine einzelne Tabelle users mit zwei jsonb Spalten zu verwenden?Relationales Datenbankdesign Gute Praxis: Normalisierung?

+0

Gute Praxis hängt von der Art der Datenbank ab, die Sie verwenden. Wenn Sie eine relationale Datenbank verwenden, [normalisieren Sie die Datenbank] (https://en.wikipedia.org/wiki/Database_normalization). Wenn Sie eine NoSQL-Datenbank verwenden, erstellen Sie Dokumente. –

Antwort

1

1] Wenn Sie Ihre Transaktion als OLTP (Online Transaction Processing) betrachten, sollten Sie drei separate Tabellen planen. Dadurch erhalten Sie eine bessere Leistung, wenn Sie verschiedene Joins zum Abrufen von Tabellendaten verwenden. Sie können Ihr Schema immer normalisieren.

1

Erstens ist eine Sache zu beachten, dass je nachdem, was Sie versuchen, jsonb erste Form brechen kann. Lassen Sie sich 1NF diskutieren und warum es eine gute Idee ist:

Erste Normalform vorhanden ist, wenn und nur wenn:

  1. Alle Zeilen bestehen aus Daten mit der gleichen Anzahl von Spalten
  2. Alle Reihen sind einzigartig
  3. Alle Werte in allen Spalten sind Atom

Nun sind die ersten beiden leicht zu verstehen, aber die dritte ist tatsächlich umstritten. Bedeutet das, dass alles maximal zerlegt werden muss? Nun, solange datetime columns erlaubt sind, kann das nicht heißen ....

Der beste Weg, um über die Atomizitätsanforderung nachzudenken, ist meiner Meinung nach, dass jeder Wert in der Tabelle einen einzelnen Wert in einer Domäne darstellt. Zwei Dinge brechen daher hier die Atomitätsanforderung 1NF. Die ersten sind Sets (mit Arrays, bei denen die Reihenfolge keine Rolle spielt, zum Beispiel Tags in Blogposts), und die zweite ist das Speichern von Daten, in denen interne funktionale Abhängigkeiten vorhanden sind.

Warum ist beides wichtig? Mamanging-Sets in Spalten schaffen viele Möglichkeiten für viele zusätzliche Arbeit in der Datenbank. Transitive Abhängigkeiten stellen ebenfalls Probleme dar. Sie können beispielsweise keinen Fremdschlüssel aus einem Feld in Ihrem jsonb verwenden, das auf etwas in einer anderen Tabelle verweist.

In Bezug auf die Leistung werden Sie wahrscheinlich nicht viel Unterschied sehen, wenn Sie nur Einstellungen und Anwendungs-Blobs speichern, daher ist die zusätzliche Funktionalität wichtig. Beachten Sie, dass PostgreSQL (kann nicht für andere dbs sprechen) TOAST große Felder. TOASTed-Felder verursachen in einigen Fällen zusätzlichen Overhead, aber nicht in anderen, und es ist viel schwieriger, die Auswirkungen auf eine Abfrage zu messen als auf einen Join. Das ist also ein anderes Zeichen dagegen. TOAST ist eine großartige Technik, aber es ist kein kostenloses Mittagessen. Sie können also die gleichen Auswirkungen auf die Leistung haben, aber auf eine viel weniger transparente Weise.