Ich bin gerade dabei, eine Datenbank zu entwerfen, und habe Bedenken hinsichtlich meiner anfänglichen Entwurfsentscheidungen ...
Die Produkttypen sind wie folgt: Modelle, Teile, Ersatzteilsätze und Optionen.
Option A (erster Entwurf): Ich plante, separate Tabellen für die oben genannten Produkttypen zu haben. Ich würde sagen, dass 75% der Felder in jeder Tabelle gleich sind.
Ich habe jeden Produkttyp als separate Tabellen erstellt, da ich zwischen ihnen Verknüpfungen erstellen muss. Zum Beispiel kann ein Modell viele Optionen haben und eine Option kann viele Modelle haben. Eine Option kann auch viele Teile haben und ein Teil kann viele Optionen haben ... und so weiter ...
Option B: Anstatt separate Tabellen zu haben, könnte ich eine Tabelle mit dem Namen Product erstellen, die Modell-, Teil-, Ersatzteil-Kits und Optionen umfasst. Ich könnte ein Feld mit dem Namen Typ haben, um zwischen Modell, Optionen usw. zu unterscheiden. Ich nehme an, dass mehrere Felder für bestimmte Produkttypen niemals verwendet werden (Null). Ich vermute, dass hier "nicht die besten Praktiken" ins Spiel kommen würden.
Option B würde die Komplexität des Datenbankentwurfs erheblich verringern. Ich würde mir auch keine Sorgen machen müssen, wenn ich Daten für Abfragen aus einer Reihe von Tabellen abrufen würde ...
quelle
Antworten:
Wenn dies meine Entwurfsentscheidung wäre, würde ich wahrscheinlich eher eine "Option C" wählen (modifizierte Option a).
Zunächst, warum nicht 'Option B':
Zum einen mag ich die Klarheit, dass jedes Produkt einen eigenen Tisch bietet. Wenn es sich nur um eine große Tabelle mit einem Feld zur Bestimmung des Typs handelt, ist die Beziehung nicht so klar.
Zum anderen würde die Indizierungsstrategie immer die Auflistung dieses Typfelds erfordern. Da es sich nur um 4 Typen handelt, ist die Index-Kardinalität extrem niedrig (
SELECT * FROM product_table WHERE type='X'
führt im Grunde genommen trotzdem einen vollständigen Tabellenscan durch).Option C
Der Nachteil besteht in der Komplexität, sicherzustellen, dass Waisen vermieden werden, wenn Dinge aktualisiert / gelöscht werden, und zunächst die Abfragen zu entwerfen, die diese Tabellen verwenden.
quelle
productID
wäre ein FK zuproduct.id
, undoptionID
ist ein FK zuoption.id
. Das habe ich mit Verknüpfungstabelle gemeint. Und ja, bei diesem Design ist es erforderlich, dass ein einzelnes Produkt mit mehreren Optionen verknüpft werden kann.Ich würde vorschlagen, dass Sie mit dem "richtigen" relationalen Modell beginnen, Ihrer Option A. Wenn die typische Verwendung dieses Modells Sie in einigen Bereichen zur Denormalisierung führt, haben Sie keine Angst davor.
Ich habe letzte Woche mit einem Kollegen diskutiert, wie Schemaentwürfe oft als etwas angesehen werden, das in Stein gemeißelt ist und sich nie ändern kann. Seltsamerweise wird das Refactoring eines Datenbankschemas in Anbetracht der Tatsache, dass Refactoring in jeder anderen Ebene einer Anwendung gängige Praxis ist, immer noch als unpraktisch angesehen.
Wenn die Schnittstelle zur Datenbank gut gestaltet ist, hindert Sie nichts daran, das Schema anzupassen, während Sie mehr über die Nutzungsmuster des Systems erfahren.
quelle
Dies hört sich sehr ähnlich an wie die Erbschaft von Stücklisten / multiplen Kardinalitäten , die Paul Neilsen in Kapitel 17 der SQL Server 2008-Bibel beschreibt .
Das gesamte Kapitel ist sehr gut gelesen und der spezifische Abschnitt, der sich mit Ihrem Many-to-Many-Problem befasst, befindet sich auf den Seiten 416-419.
Dies ist die beste Diskussion, die ich in Bezug auf den Explosionsteiletyp des Datenentwurfs gesehen habe.
quelle
Wenn Sie sich ein wahrscheinliches Szenario vorstellen können, in dem häufig Fragen zu allen vier Produkttypen auftreten (und das scheint mir wahrscheinlich zu sein), ist Ihre Option B die beste.
Anstatt viele nicht verwendete nullfähige Felder in der Product-Tabelle zu belassen, können Sie eine ModelProduct-Tabelle, eine PartProduct-Tabelle, eine ReplacementPartKitProduct-Tabelle und nur die Felder hinzufügen, die für diese Typen in diesen Tabellen unterschiedlich sind. Verwenden Sie für diese Tabellen denselben Primärschlüssel wie für Ihre Produkttabelle. Verknüpfen Sie die Tabelle Product und ModelProduct, wenn Sie mit Models arbeiten möchten. Müssen Sie feststellen, ob es sich bei Ihrem Produktdatensatz um ein Teil handelt? Führen Sie einfach eine Verknüpfung von Product zu PartProduct durch, und wenn PartProduct. [PrimaryKey] nicht null ist, haben Sie ein Part. Wenn es null ist, ist es kein Teil. Alternativ können Sie der Product-Tabelle ein ProductType-Feld hinzufügen.
quelle