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?
Antwort
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.
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:
- Alle Zeilen bestehen aus Daten mit der gleichen Anzahl von Spalten
- Alle Reihen sind einzigartig
- 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.
- 1. Nicht relationales Datenbankdesign mit SQL Server?
- 2. relationales Datenbank-Design (Normalisierung many-to-many-Mappings)
- 3. Gute Praxis Klasse Zeilenanzahl
- 4. ViewHolder - gute Praxis
- 5. ist eine gute Praxis
- 6. Gute Praxis um Seiten umzuleiten?
- 7. gute Praxis für Code-Flow?
- 8. PHP Gute Praxis der Kryptographie?
- 9. Wird mapM/sequenz als gute Praxis angesehen?
- 10. Datenbank Upserts - Gute oder schlechte Praxis?
- 11. ASP.NET MVC - TempData - gute oder schlechte Praxis
- 12. Verwendet MS SQL Identity gute Praxis?
- 13. Ist "Behauptung falsch"; eine gute Praxis?
- 14. Master-Include-Dateien - gute oder schlechte Praxis
- 15. Ist ein Beispiel für eine gute Praxis?
- 16. gute Praxis in C++ (faule Bewertung)
- 17. Provider Service oder Container injizieren. Gute Praxis
- 18. Shapes in E-Mails - eine gute Praxis?
- 19. Relationale Datenbank Redundanz und Normalisierung
- 20. Stundenzettel Datenbankdesign
- 21. Datenbank Normalisierung
- 22. Grails automatisches relationales Holen
- 23. Linqdatasource und relationales Datenproblem
- 24. Object/Relationales Mapping
- 25. Merkmal Normalisierung- Vorteil der Normalisierung l2
- 26. Gute Praxis: Organisation von views.py in Django Apps
- 27. ist es gute Praxis, CallBacks Redux async Aktion zu übergeben?
- 28. Gute Praxis Weg zum Ausgang/Insert-post-Daten
- 29. Ist es eine gute Praxis, Variablen in Perl zu exportieren?
- 30. Websocket-basierte App, Sicherheit und gute Praxis in Echtzeit?
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. –