Das ist also eher eine Designfrage.
Ich habe einen Primärschlüssel (z. B. die Benutzer-ID) und diesem Benutzer sind unzählige Informationen zugeordnet.
Sollte ich mehrere Tabellen haben, die gemäß den Informationen in Kategorien unterteilt sind, oder sollte ich nur eine Tabelle mit vielen Spalten haben?
Früher hatte ich mehrere Tabellen, z. B. eine Tabelle für Anwendungsnutzungsdaten, eine Tabelle für Profilinformationen, eine Tabelle für Back-End-Token usw., um die Übersichtlichkeit zu gewährleisten.
Kürzlich sagte mir jemand, dass es besser ist, es nicht so zu machen und eine Tabelle mit vielen Spalten zu haben, ist in Ordnung. Die Sache ist, alle diese Spalten haben den gleichen Primärschlüssel.
Ich bin ziemlich neu im Datenbankdesign. Welcher Ansatz ist also besser und welche Vor- und Nachteile gibt es?
Wie geht das konventionell?
quelle
Antworten:
Jedes Mal, wenn Informationen eins zu eins sind (jeder Benutzer hat einen Namen und ein Kennwort), ist es wahrscheinlich besser, eine Tabelle zu haben, da dadurch die Anzahl der Verknüpfungen verringert wird, die die Datenbank zum Abrufen der Ergebnisse ausführen muss. Ich denke, einige Datenbanken haben eine Begrenzung für die Anzahl der Spalten pro Tabelle, aber ich würde mir im Normalfall keine Sorgen machen, und Sie können sie später jederzeit aufteilen, wenn Sie müssen.
Wenn die Daten eins zu viele sind (jeder Benutzer verfügt über Tausende von Zeilen mit Verwendungsinformationen), sollten sie in separate Tabellen aufgeteilt werden, um doppelte Daten zu reduzieren (doppelte Daten verschwenden Speicherplatz, Cache-Speicher und erschweren die Wartung der Datenbank ).
Vielleicht finden Sie den Wikipedia-Artikel zur Datenbanknormalisierung interessant, da er die Gründe dafür ausführlich beschreibt:
Die Denormalisierung ist ebenfalls zu beachten, da es Fälle gibt, in denen das Wiederholen von Daten besser ist (da dadurch der Arbeitsaufwand für die Datenbank beim Lesen von Daten verringert wird). Ich würde dringend empfehlen, Ihre Daten zu Beginn so normal wie möglich zu gestalten und nur dann zu denormalisieren, wenn Sie Leistungsprobleme bei bestimmten Abfragen kennen.
quelle
Ein großer Tisch ist oft eine schlechte Wahl. Verwandte Tabellen sind das, wofür relationale Datenbanken entwickelt wurden. Wenn Sie richtig indizieren und wissen, wie man performante Abfragen schreibt, werden sie gut funktionieren.
Wenn Tabellen zu viele Spalten enthalten, können Probleme mit der tatsächlichen Größe der Seite auftreten, auf der die Datenbank die Informationen speichert. Entweder ist der Datensatz zu groß für die Seite, wodurch Sie möglicherweise nicht in der Lage sind, einen bestimmten Datensatz zu erstellen oder zu aktualisieren, was Benutzer unglücklich macht, oder Sie können (zumindest in SQL Server) einen bestimmten Überlauf erhalten Datentypen (mit einer Reihe von Regeln, nach denen Sie suchen müssen, wenn Sie dies tun), aber wenn viele Datensätze die Seitengröße überschreiten, können Sie erhebliche Leistungsprobleme verursachen. Wie MYSQL nun mit den Seiten umgeht und ob Sie ein Problem haben, wenn die potenzielle Seitengröße zu groß wird, müssen Sie in der Dokumentation für diese Datenbank nachschlagen.
quelle
Ich habe ein gutes Beispiel. Übermäßig normalisierte Datenbank mit den folgenden Beziehungen:
und
Wenn Personen Namen und Personendetails haben, hat das Personal nur die Personaldatensätze, die Interessenten nur die Interessentendetails und die rel-Tabellen sind Beziehungstabellen mit Fremdschlüsseln von Personen, die mit Mitarbeitern und Interessenten verknüpft sind.
Diese Art von Design wird für die gesamte Datenbank fortgesetzt.
Um diesen Satz von Beziehungen abzufragen, handelt es sich jedes Mal um einen Join mit mehreren Tabellen, manchmal um 8 und mehr Tabellen. Es hat bis Mitte dieses Jahres gut funktioniert, als es langsam wurde, nachdem wir 40000 Aufzeichnungen von Menschen hinter uns gelassen hatten.
Indizierung und alle niedrig hängenden Früchte waren im letzten Jahr aufgebraucht, alle Abfragen sind perfekt optimiert. Dies ist das Ende des Weges für das jeweilige normalisierte Design und Management, das nun eine Neuerstellung der gesamten Anwendung, die davon abhängt, sowie eine Umstrukturierung der Datenbank über einen Zeitraum von 6 Monaten genehmigt hat. $$$$ Autsch.
Die Lösung wird darin bestehen, eine direkte Beziehung zu
people -> staff
und zu habenpeople -> prospect
quelle
type
Wesenstaff
oder ein Wesen hattenprospect
?Als jemand, der MySQL häufig verwendete und kürzlich zu Postgres wechselte, war einer der großen Vorteile, dass Sie einem Feld in Postgres JSON-Objekte hinzufügen können.
Wenn Sie sich in dieser Situation befinden, müssen Sie sich nicht unbedingt zwischen einer großen Tabelle mit vielen Spalten entscheiden und diese aufteilen. Sie können jedoch Spalten in JSON-Objekte zusammenführen, um sie zu reduzieren, z. B. anstatt dass die Adresse 5 Spalten umfasst eins sein. Sie können dieses Objekt auch abfragen.
quelle
Stellen Sie sich diese Fragen, wenn Sie alles in eine Tabelle einfügen. Haben Sie mehrere Zeilen für diesen Benutzer? Wenn Sie einen Benutzer aktualisieren müssen, möchten Sie einen Audit-Trail führen? Kann der Benutzer mehr als eine Instanz eines Datenelements haben? (wie zum Beispiel die Telefonnummer) Haben Sie einen Fall, in dem Sie später möglicherweise ein Element oder eine Reihe von Elementen hinzufügen möchten? Wenn Sie mit Ja antworten, möchten Sie höchstwahrscheinlich untergeordnete Tabellen mit Fremdschlüsselbeziehungen haben.
Vorteile von übergeordneten / untergeordneten Tabellen sind Datenintegrität, Leistung über Indizes (ja, Sie können dies auch für eine flache Tabelle tun) und IMO einfacher zu warten, wenn Sie später ein Feld hinzufügen müssen, insbesondere wenn es sich um ein erforderliches Feld handelt.
Nachteile Design ist schwieriger, Abfragen werden etwas komplexer
Es gibt jedoch viele Fälle, in denen ein großer flacher Tisch angemessen ist, sodass Sie sich Ihre Situation ansehen müssen, um eine Entscheidung zu treffen.
quelle
Ich bin schon mit einer Art Datenbankdesign fertig. Für mich hängt es von der Schwierigkeit des Systems bei der Datenbankverwaltung ab. Ja, es ist wahr, eindeutige Daten nur an einem Ort zu haben, aber es ist wirklich schwierig, Abfragen mit einer übermäßig normalisierten Datenbank mit vielen Datensätzen durchzuführen. Kombinieren Sie einfach die beiden Schemata. Verwenden Sie eine große Tabelle, wenn Sie das Gefühl haben, dass Sie massive Datensätze haben, die schwer zu pflegen sind, genau wie Facebook, Google Mail usw. und benutze eine andere Tabelle für einen Datensatz für ein einfaches System ... nun, das ist nur meine Meinung ... ich hoffe es könnte helfen ... mach es einfach ... du kannst es machen ... :)
quelle
Die herkömmliche Methode hierfür wäre die Verwendung unterschiedlicher Tabellen wie in einem Sternschema oder einem Schneeflockenschema. Ich würde diese Strategie jedoch auf zwei Gründe stützen. Ich glaube an die Theorie, dass Daten nur an einem Ort existieren sollten, da dort das von mir erwähnte Schema gut funktionieren würde. Ich bin jedoch auch der Meinung, dass ein Columnar-Ansatz für Reporting-Engines und BI-Suites von großem Vorteil wäre, da er die Reporting-Anforderungen besser unterstützt. Säulenansätze wie die mit infobright.org weisen enorme Leistungssteigerungen und Komprimierungen auf, was die Verwendung beider Ansätze unglaublich nützlich macht. Viele Unternehmen beginnen zu erkennen, dass nur eine Datenbankarchitektur in der Organisation nicht die gesamte Bandbreite ihrer Anforderungen unterstützt. Viele Unternehmen implementieren beide das Konzept, mehr als eine Datenbankarchitektur zu haben.
quelle
Ich denke, eine einzelne Tabelle ist effektiver, aber Sie sollten sicherstellen, dass die Tabelle so organisiert ist, dass sie die Beziehung, den Trend sowie den Unterschied in den Variablen derselben Zeile anzeigt. Wenn die Tabelle beispielsweise das Alter und die Noten der Schüler anzeigt, sollten Sie die Tabelle so anordnen, dass der höchste Punktestand gut vom niedrigsten Punktestand unterschieden wird und der Altersunterschied der Schüler gleichmäßig ist.
quelle