Frage

Ein ehemaliger Mitarbeiter bestand darauf, dass eine Datenbank mit mehreren Tabellen mit weniger Spalten je ist besser als ein mit weniger Tabellen mit mehreren Spalten je. Zum Beispiel statt einer Kundentabelle mit Namen, Adresse, Stadt, Bundesland, Postleitzahl, usw. Spalten, würden Sie einen Namen Tabelle haben, eine Adresstabelle, eine Stadt, Tisch, etc.

Er argumentierte, dieser Entwurf effizienter und flexibler war. Vielleicht ist es flexibler, aber ich bin nicht auf ihre Effizienz kommentieren qualifiziert. Auch wenn es effizienter ist, denke ich, dass diese Gewinne können durch die zusätzliche Komplexität aufgewogen werden.

So, gibt es erhebliche Vorteile für mehr Tabellen mit weniger Spalten über weniger Tabellen mit mehreren Spalten?

War es hilfreich?

Lösung

Ich habe ein paar ziemlich einfache Faustregeln ich folgen, wenn Datenbanken entwerfen, die ich denke, verwendet werden können, um diese Entscheidungen zu treffen wie ....

  1. Favor Normalisierung. Denormalisierung ist eine Form der Optimierung, mit allen erforderlichen Abwägungen, und als solche sollte sie mit einem YAGNI angefahren werden Haltung.
  2. Stellen Sie sicher, dass Client-Code die Datenbank Referenzierung genug aus dem Schema entkoppelt ist, dass es Nacharbeiten keine große Neugestaltung des Kunden erforderlich machen (s).
  3. Haben Sie keine Angst zu denormalize, wenn es einen klaren Nutzen für die Leistung oder Abfrage Komplexität bietet.
  4. Verwenden Sie Ansichten oder nachgeschaltete Tabellen-Normalisierungs zu implementieren, anstatt Denormalisierung den Kern des Schemas, , wenn Datenvolumen und Nutzungsszenarien ermöglichen es .

Das übliche Ergebnis dieser Regeln ist, dass das anfängliche Design Tabellen über Spalten, mit einem Fokus auf der Beseitigung von Redundanz begünstigen. Im weiteren Projektverlauf und Denormalisierung Punkte identifiziert werden, die Gesamtstruktur wird zu einem Gleichgewicht entwickeln, die für andere wertvolle Vorteile mit begrenzten Redundanz und Spalten Proliferation im Austausch kompromittiert.

Andere Tipps

würde ich für mehr Tische streiten, aber nur bis zu einem gewissen Punkt. Mit Ihrem Beispiel, wenn Sie Ihre Benutzer-Informationen in zwei Tabellen getrennt, sagen Benutzer und ADDRESS, das gibt Ihnen die Flexibilität, mehrere Adressen pro Benutzer zu haben. Eine offensichtliche Anwendung hierfür ist ein Benutzer, die getrennte Rechnungs- und Lieferadresse hat.

Das Argument für eine separate Tabelle CITY mit wäre, dass Sie nur einmal in jeder Stadt den Namen zu speichern, dann darauf verweisen, wenn Sie es brauchen. Das macht reduziert Vervielfältigung, aber in diesem Beispiel, das ich denke, es ist übertrieben. Es kann mehr Platz effizient sein, aber Sie werden den Preis zahlen in beitritt, wenn Sie Daten aus Ihrer Datenbank auswählen.

Es klingt nicht so viel wie eine Frage über Tabellen / Spalten, sondern um eine Normalisierung. In einigen Situationen haben ein hohes Maß an Normalisierung ( „mehr Tabellen“ in diesem Fall) sind gut und sauber, aber es dauert in der Regel eine hohe Anzahl von Joins relevanten Ergebnisse zu erhalten. Und mit einer ausreichend großen Datenmenge, dies kann die Leistung versinken.

Jeff ein wenig darüber in Bezug auf die Gestaltung von Stackoverflow geschrieben. Siehe auch der Post Jeff Links zu von Dare Obasanjo .

Ein vollständig normalisiert Design (das heißt, „Mehr-Tabellen“) ist flexibler, leichter zu pflegen und vermeidet doppelte Daten, die Ihre Datenintegrität bedeutet, wird viel einfacher zu erzwingen.

Das sind gewichtige Gründe, zu normalisieren. Ich würde wählen Sie zuerst zu normalisieren, und dann nur denormalize spezifische Tabellen nach Sie, dass die Leistung sah ein Problem wurde immer.

Meine Erfahrung ist, dass in der realen Welt, werden Sie nicht den Punkt erreicht, wo Denormalisierung erforderlich ist, auch bei sehr großen Datenmengen.

Es hängt von Ihrer Datenbank Geschmack. MS SQL Server, zum Beispiel, neigen engere Tabellen zu bevorzugen. Das ist auch der mehr ‚normalisiert‘ Ansatz. Andere Motoren könnte es anders lieber um. Großrechner neigen dazu, in diese Kategorie zu fallen.

Jede Tabelle soll nur Spalten enthält, die das Unternehmen gehören, die von dem Primärschlüssel eindeutig identifiziert wird. Wenn alle Spalten in der Datenbank alle Attribute der gleichen Einheit sind, dann würden Sie brauchen nur eine Tabelle mit allen Spalten.

Wenn eine der Spalten null sein können, aber Sie müssten jede Spalte von -zulässige in eine eigene Tabelle setzen mit einem Fremdschlüssel der Haupttabelle, um es zu normalisieren. Dies ist ein gängiges Szenario, so dass für eine sauberere Design, sind Sie likley mehr Tabellen als Spalten zu vorhandenen Tabellen hinzufügen. Auch durch diese optionalen Attribute, um ihre eigenen Tabelle hinzugefügt, würden sie nicht mehr brauchen nulls zu ermöglichen und Ihnen eine ganze Reihe von NULL-bezogene Probleme zu vermeiden.

Die Multi-Table-Datenbank ist viel flexibler, wenn eine dieser 00.59 Beziehungen ein zu viele werden kann oder viele zu viele in der Zukunft. Zum Beispiel, wenn Sie mehrere Adressen für einige Kunden speichern müssen, dann ist es viel einfacher, wenn Sie eine Kundentabelle und eine Adressentabelle haben. Ich kann nicht wirklich eine Situation, wo Sie müssen eventuell einige Teile einer Adresse kopieren, andere aber nicht, so trennt Adresse, Stadt, Staat und Zip-Tabellen können ein wenig übertrieben sein.

Wie alles andere. Es hängt

Es gibt keine feste Regel in Bezug auf Spaltenanzahl vs Tabelle zählen.

Wenn Ihre Kunden mehrere Adressen haben müssen, dann eine eigene Tabelle für das macht Sinn. Wenn Sie einen wirklich guten Grund haben die Spalte City in seine eigene Tabelle zu normalisieren, gehen das kann dann auch, aber ich habe nicht gesehen, dass vor, weil es sich um eine freie Formularfeld ist (in der Regel).

Eine Tabelle schwer, normalisiert Design ist effizienter in Bezug auf Raum und sieht „Lehrbuch-gut“, aber kann sehr komplex werden. Es sieht gut aus, bis Sie zu tun haben, 12 schließt sich ein Kunde Name und Adresse zu erhalten. Diese Entwürfe sind nicht automatisch fantastisch in Bezug auf Leistung, die am meisten zählt. Abfragen

Vermeiden Komplexität, wenn möglich. Zum Beispiel, wenn ein Kunde nur zwei Adressen (nicht beliebig viele) hat, dann könnte es Sinn machen, um sie einfach alle in einer einzigen Tabelle (CustomerID, Namens-, ShipToAddress, Rechnungsanschrift, ShipToCity, BillingCity usw.).

Hier ist Jeffs Post zum Thema.

Es gibt Vorteile auf Tabellen mit weniger Spalten, aber Sie müssen auch oben in Ihrem Szenario betrachten und diese Fragen beantworten:

Wird der Kunde erlaubt mehr als 1-Adresse haben? Wenn nicht, dann ist eine separate Tabelle für die Adresse nicht erforderlich. Wenn ja, dann wird eine separate Tabelle wird hilfreich, weil Sie leicht mehr Adressen hinzufügen können, wie die Straße benötigten nach unten, wo es schwieriger wird, zu mehr Spalten der Tabelle hinzufügen.

Ich würde als erster Schritt der Normalisierung, so Städte, Landkreise, Länder, würden Länder als separate Spalten besser ... die Macht der SQL-Sprache, zusammen mit dem heutigen DBMS-es ermöglicht die Gruppe später Ihre Daten, wenn Sie müssen sie in einer anderen, nicht-normalisierte Ansicht anzuzeigen.

Wenn das System entwickelt wird, könnte man erwägen ‚unnormalizing‘ einen Teil, wenn Sie sehen, dass als eine Verbesserung.

Ich denke, Balance, um in diesem Fall ist. Wenn es sinnvoll ist, eine Spalte in einer Tabelle zu setzen, legte es dann in der Tabelle, wenn es nicht der Fall ist, dann nicht. Ihre Mitarbeiter Ansatz würde auf jeden Fall helfen, die Datenbank zu normalisieren, aber das ist vielleicht nicht sehr nützlich sein, wenn Sie 50 Tabellen verbinden müssen, um zusammen die Informationen, die Sie benötigen.

Ich denke, was meine Antwort wäre, verwenden Sie am besten Urteil.

Es gibt viele Seiten zu diesem, aber aus einer Anwendung Effizienz Perspektive mote-Tabellen können effizienter manchmal sein. Wenn Sie jedes Mal der DB ein paar Tische mit einem Bündel von Spalten als eine Operation zu tun, es eine Chance hat, eine Sperre zu machen, mehr Daten nicht verfügbar gemacht für die Dauer der Sperre. Wenn Sperren Seite und Tabellen eskalieren bekommen (auch hoffentlich nicht Tabellen :)) Sie können sehen, wie diese das System verlangsamen kann.

Hmm.

Ich denke, die eine Wäsche und hängt von Ihrem speziellen Design-Modell. Auf jeden Fall ausklammern Unternehmen, die mehr als ein paar Felder aus in ihren eigenen Tisch haben oder Personen, deren Make-up wird wahrscheinlich die Anforderungen Ihrer Anwendung Änderungen ändern (zum Beispiel - ich würde sowieso Adresse ausklammern, da es so viele Felder hat, aber ich ‚d insbesondere es tun, wenn Sie dachten, dass es eine Chance, war Sie fremden Land Adressen zu behandeln brauchen würde, die von einer anderen Form sein kann. Das gleiche gilt für Telefonnummern).

Das heißt, wenn du hast bist es funktioniert, halten Sie ein Auge auf die Leistung aus. Wenn Sie ein Unternehmen aus gesponnen haben, die Sie groß tun erfordert, teuer beitritt, vielleicht wird es eine bessere Design-Entscheidung, dass die Tabelle wieder in die ursprünglichen Spin.

Es gibt enorme Vorteile für Abfragen mit so wenigen Spalten wie möglich. Aber die Tabelle selbst kann eine große Anzahl hat. Jeff sagt dazu auch etwas.

Im Grunde genommen, stellen Sie sicher, dass Sie nicht mehr fragen, als Sie brauchen, wenn Sie eine Abfrage zu tun -. Leistung von Abfragen direkt mit der Anzahl der Spalten im Zusammenhang fragen Sie nach

Ich glaube, Sie an der Art von Daten suchen Sie speichern sind, bevor Sie diese Entscheidung zu treffen. eine Adressentabelle ist groß, aber nur dann, wenn die Wahrscheinlichkeit, dass mehrere Personen die gleiche Adresse teilen, ist hoch. Wenn jeder Mensch unterschiedliche Adressen hatte, dass die Daten in einer anderen Tabelle zu halten bringt nur unnötige verbindet.

Ich sehe nicht den Nutzen einer Stadt Tabelle mit, es sei denn Städte in der sich Einheiten sind, die Sie interessieren in Ihrer Anwendung. Oder wenn Sie die Anzahl der Städte der Benutzer zur Verfügung zu begrenzen.

Unterm Strich ist Entscheidungen wie diese, die Anwendung zu nehmen haben sich in möchten, bevor Sie für die Effizienz der Aufnahme beginnen. IMO.

Wenn Sie Ihre Datenbank entwerfen, sollten Sie von der Bedeutung von Daten so nah wie möglich sein und nicht Ihre Anwendung!

Ein gutes Datenbank-Design sollte ohne Änderung über 20 Jahre steht.

Ein Kunde mehrere Adressen haben könnte, das ist die Realität. Wenn Sie das Ihre Anwendung entschieden, eine Adresse für das erste Release begrenzt ist, ist es betrifft die Planung Ihrer Anwendung der Daten nicht!

Es ist besser, mehrere Tisch zu haben, anstatt mehrere Spalte und Ansicht verwenden, wenn Sie Ihre Suche vereinfachen möchten.

Die meisten Zeit, die Sie Performance-Problem mit einer Datenbank haben wird es um die Netzwerkleistung (Ketten Abfrage mit einer Zeile Ergebnis holen Spalte, die Sie nicht benötigen, etc.) nicht über die Komplexität der Anfrage.

Zuerst normalisieren Ihre Tabellen. Dadurch wird sichergestellt, Sie redundante Daten vermeiden, können Sie weniger Datenzeilen geben zu scannen, die Ihre Anfragen verbessert. Dann, wenn Sie in einen Punkt laufen, wo die normalisierte Tabellen Sie beitreten verursachen die Abfrage zu lange dauern Verfahren (teuer JOIN-Klausel), denormalize geeignetere wo.

Gut so viele anregenden und gut fundierte Antworten zu sehen.

Meine Antwort wäre (leider): es hängt

.

Zwei Fälle: viele zukünftigen Änderungen * Wenn Sie ein Datenmodell erstellen, das seit vielen Jahren und damit möglicherweise verwendet werden soll Adept: geht für mehr Tische und weniger Zeilen und ziemlich streng Normalisierung. * In anderen Fällen können Sie zwischen mehreren Tabellen losen Zeilen oder weniger Tabellen-Zeilen mehr wählen. Speziell für Menschen relativ neu in das Thema dieser letzte Ansatz intuitiver sein kann und leicht zu verstehen.

Das gleiche gilt für die Wahl zwischen dem objektorientierten Ansatz gültig und anderen Optionen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top