Welche Alternativen gibt es, wenn für eine Tabelle zu viele Fremdschlüssel erforderlich sind?

8

Wir haben eine Basistabelle, die Teile definiert und Informationen wie Teilenummer, Beschreibung, Preis, Gewicht usw. enthält. Wir haben auch ungefähr 400 Tabellen, die auf die Basistabelle verweisen und zusätzliche Informationen zu den Teilen basierend auf ihrem Typ / ihrer Kategorie bereitstellen.

Wir haben zunächst Fremdschlüsseleinschränkungen verwendet, damit ein Teil nicht aus der Basistabelle gelöscht werden kann, wenn auf es in einer der 400 teilespezifischen Tabellen verwiesen wird. Wir haben jedoch schnell die maximal 253 empfohlenen Fremdschlüssel für SQL Server 2005 erreicht.

Gibt es in dieser Situation Alternativen zu Fremdschlüsseln, die die Datenintegrität gewährleisten? Beim Zugriff auf die Daten sind keine Leistungsprobleme aufgetreten. Die Aktualisierung eines vorhandenen Teils in der Basistabelle schlägt jedoch fehl, da der Abfrageplan zu komplex ist.

jellomonkey
quelle
14
Denken Sie wirklich, dass Sie 400 teilespezifische Tabellen benötigen? Wie unterschiedlich sind diese Tabellen wirklich? Ich denke, Sie versuchen, den falschen Teil dieses Entwurfs zu reparieren.
Aaron Bertrand
2
Wie viele Zeilen haben Sie ungefähr in dieser Datenbank?
Jon Seigel
4
Ich muss Aaron Bertrand zustimmen. Wenn Ihr Design erfordert, dass Sie die Unterstützung für Fremdschlüssel-SQL-Server maximal nutzen, ist es möglicherweise an der Zeit, ein Redesign in Betracht zu ziehen.
DForck42
5
Ich habe viele Entwürfe in diesem Bereich gemacht - Preisgestaltung, Produktmanagement, Produktspezifikationen. Selbst in stark normalisierten Designs bin ich noch nie so vielen FKs am selben Tisch nahe gekommen. Führen Sie möglicherweise eine Datenpartitionierungsstrategie durch (nach Client oder Zeit oder ähnlichem), die Sie veranlasst hat, in diese Richtung zu entwerfen? Es ist schwierig, eine Antwort ohne weitere Informationen zu Ihrem Design und Ihren Designzielen zu geben.
Karen Lopez
4
Könnten Sie ein Beispiel für ein Schema für 5 dieser Tabellen
angeben

Antworten:

6

Wenn es eine Möglichkeit gibt, Teile zu gruppieren, können Sie möglicherweise Zwischentabellen als Problemumgehung einführen. Das wird nicht funktionieren.

Parts
+ Table 1
+ Table 2
+ ...
+ Table 400

Aber etwas in diese Richtung könnte.

Parts
+ RedOrangeYellow parts
  + Table 1
  + Table 2
  + ...
  + Table 200

+ GreenBlueIndigoViolet parts
  + Table 201
  + Table 202
  + ...
  + Table 400

Ich möchte mir Ihre DDL genauer ansehen, bevor ich dies empfehle . Und wenn Sie dies tun, werfen Sie nicht überall ID-Nummern. Sie sollten in der Lage sein, "Tabelle 400" direkt mit "Teilen" zu verknüpfen, ohne "GreenBlueIndigoViolet-Teile" einzuschließen.

Mike Sherrill 'Cat Recall'
quelle
-4

Ersetzen Sie die über 400 Tabellen durch eine. Benötigen Sie nur 3 Felder (+1 Autonummer oder welcher Primärschlüssel auch immer, wenn Sie es möchten, müssen Sie es nicht haben, Sie können es aus den anderen Feldern bilden)

Artikel-ID-Attributwert

Wo also in Ihren anderen Tabellen jedes Feld ein Attribut darstellt, befinden sich in dieser Tabelle alle Attribute in einem Feld. Du hättest so etwas

ItemID-Attributwert

Sockenmaterial Wolle

Sockenfarbe Rot

Sockengewicht 20 Pfund

Alien Planet Alpha Centauri

Alien Farbe Lila

Alien Friendly No.

Die ItemIDs sollten wahrscheinlich eine Zahl / alphanumerische Zahl von c sein. Anschließend erstellen Sie bei Bedarf nur eine Kreuztabelle mit Attributen als Spaltenüberschriften, um die gewünschten Tabellen zu generieren. Dies ermöglicht auch bessere Abfragen für Dinge wie "Zeig mir alle Gegenstände, die von Alpha Centauri stammen", die dir das Alien und auch das Meteoritenfragment zurückgeben könnten, das die Pest enthielt, die die Menschheit auslöscht (es kommt .....)

Die Optimierung kann schwierig sein, je nachdem, wie viele Datensätze vorhanden sind, aber es ist eine viel bessere Möglichkeit, dies zu entwerfen. Ich habe dasselbe für eine Datenbank gemacht, die eine Reihe von Rezepten (10k +) enthielt, die nur wenige Überlappungen aufwiesen. Hat in diesem Fall gut funktioniert. Hatte wirklich keine Geschwindigkeitsprobleme. Ihre kann schwieriger sein, je nachdem, mit wie vielen Sie es zu tun haben.

user2125055
quelle
4
Dies wird als Entity Attribute Value-Modell bezeichnet und ist aus vielen Gründen normalerweise eine ziemlich schreckliche Idee. Für Ihr Beispiel des "Alpha Centauri" -Szenarios würden Sie sich wahrscheinlich 2 Tabellenscans ansehen, und Indizes können nicht verwendet werden. Außerdem hebt es jeden Vorteil für Datentypen auf, macht relationale Einschränkungen unmöglich und ist im Allgemeinen in keinem Maße optimierbar oder skalierbar. Wenn Sie mehr als hundert Zeilen wie diese speichern müssen, tun Sie dies nicht.
JNK
2
Wie @JNK zeigt, ist dies normalerweise keine gute Lösung. Und noch schlimmer, wenn Sie es mit nur einem Tisch machen. Ich würde sagen , die mindestens 3 Tabellen sind ( Entity, Entity_Attribute, Entity_Attribute_Value). Wenn Sie eine halbgerechte Behandlung für verschiedene Datentypen und referenzielle Einschränkungen hinzufügen möchten, benötigen Sie mehr.
Ypercubeᵀᴹ
1
Während sich das OP aufgrund der Komplexität der Entitäten in ihrem System mit herkömmlichem normalisiertem Design einer gewissen Grenze nähert, werden die meisten äußerst komplexen Systeme in EAV nicht wirklich besser gehandhabt, da es eine viel schwächere Typunterstützung und Anwendungsebene bietet referenzielle Integrität, da die Daten alle ziemlich allgemein gespeichert werden. EAV hat seinen nützlichen Platz, aber ich wäre nicht bereit, es als Antwort auf dieses Problem zu empfehlen, wie derzeit angegeben.
Cade Roux
Huh, lerne jeden Tag etwas Neues. Ich bin Autodidakt und das war etwas, das ich mir ausgedacht habe, um das Rezeptproblem zu lösen, das ich hatte und das sich ähnlich anhört wie dieses Problem. Ah, gut. Vielen Dank für die Informationen dazu. Ich werde mich mit EAV befassen. Vielleicht gibt es auch einen saubereren Weg, um mein Problem zu lösen. Könnte für mich einfacher sein, da alle Werte vom gleichen Datentyp waren. Ich weiß nicht.
user2125055
2
@ user2125055 Es ist kein Problem und nimm die Kritik nicht persönlich. Wir stimmen gerade die Idee der Verwendung von EAV ab! Es gibt definitiv Anwendungsfälle, in denen es sinnvoll ist, aber wegen der Nachteile müssen Sie sehr vorsichtig damit umgehen.
JNK