Frage

Ich würde vermuten, dass dies eine halbkommonische Frage ist, aber ich kann sie in der Liste früherer Fragen nicht finden. Ich habe eine Reihe von Tabellen für Produkte, die einen Primärschlüsselindex teilen müssen. Nehmen Sie so etwas wie Folgendes an:

product1_table:
    id,
    name,
    category,
    ...other fields

product2_table:
    id,
    name,
    category,
    ...other fields

product_to_category_table:
    product_id,
    category_id

Es wäre eindeutig nützlich, einen gemeinsamen Index zwischen den beiden Produkttabellen zu haben. Beachten Sie, dass die Idee, sie getrennt zu halten, weitgehend unterschiedliche Feldersätze über die Grundlagen verfügen, jedoch eine gemeinsame Kategorisierung aufweisen.

AKTUALISIEREN:

Viele Menschen haben eine Tabelle Vererbung (oder Gen-Spec) vorgeschlagen. Dies ist eine Option, die mir bekannt ist, aber in anderen Datenbanksystemen konnte ich eine Sequenz zwischen Tabellen teilen, von der ich gehofft hatte, dass MySQL eine ähnliche Lösung hatte. Ich werde davon ausgehen, dass es nicht auf den Antworten beruht. Ich denke, ich muss mit der Tafel -Erbschaft gehen ... danke euch allen.

War es hilfreich?

Lösung

Es ist nicht wirklich häufig, nein. Es gibt keine native Möglichkeit, einen Primärschlüssel zu teilen. Was ich in Ihrer Situation tun könnte, ist Folgendes:

product_table
    id
    name
    category
    general_fields...

product_type1_table:
    id
    product_id
    product_type1_fields...

product_type2_table:
    id
    product_id
    product_type2_fields...

product_to_category_table:
    product_id
    category_id

Das heißt, es gibt eine Master-Produkttabelle, die Einträge für alle Produkte enthält und die Felder, die zwischen den Typen verallgemeinert werden, und typenspezifizierte Tabellen mit Fremdschlüssel in die Master-Produkttabelle, die die typspezifischen Daten haben.

Andere Tipps

Ein besseres Design besteht darin, die gemeinsamen Spalten in eine Produkttabelle und die speziellen Spalten in zwei separaten Tabellen zu setzen. Verwenden Sie das product_id als Hauptschlüssel in allen drei Tabellen, aber in den beiden speziellen Tabellen ist es zusätzlich ein Fremdschlüssel zurück in die Hauptprodukttabelle.

Dies vereinfacht die grundlegende Produktsuche nach IDs und Namen nach Kategorie.

Beachten Sie auch, dass Ihr Design es jedem Produkt ermöglicht, höchstens in einer Kategorie zu sein.

Es scheint, dass Sie nach der Tischvererbung suchen.

Sie könnten eine gemeinsame Tabelle verwenden product mit Attributen, die sowohl Produkt1 als auch product2, plus a type Attribut, das entweder sein könnte "product2" oder "product1"

Dann Tische product1 und product2 hätte alle ihre spezifischen Attribute und einen Hinweis auf die Elternteil Tisch product.

product:
    id,
    name,
    category,
    type

product1_table:
    id,
    #product_id,
    product1_specific_fields

product2_table:
    id,
    #product_id,
    product2_specific_fields

Lassen Sie mich zuerst sagen, dass ich mit allem zustimme, dass Chaos, Larry und Phil gesagt haben.

Aber wenn Sie auf andere Weise bestehen ...

Es gibt zwei Gründe für Ihre gemeinsame PK. Eine Einzigartigkeit über die beiden Tabellen und zwei, um die Referenzintegrität zu vervollständigen.

Ich bin mir nicht sicher, welche "Sequenz" die Unterstützung von Auto_increments unterstützt. Es scheint, als gäbe es eine Systemeinstellung Um den Inkrement nach Wert zu definieren, aber nichts pro Spalte.

Was ich in Oracle tun würde, ist nur die gleiche Sequenz zwischen den beiden Tabellen zu teilen. Eine andere Technik wäre, einen Schrittwert von 2 in der auto_increment festzulegen und eine bei 1 und die andere unter 2 zu starten. In beiden Fällen generieren Sie eindeutige Werte zwischen ihnen.

Sie könnten eine dritte Tabelle erstellen, die nur die PK -Spalte hat. Diese Spalte könnte auch das AutoNumbering liefern, wenn es keine Möglichkeit gibt, einen übersprungenen Autonumber auf einem Server zu erstellen. In jedem Ihrer Datentabellen würden Sie Crud -Trigger hinzufügen. Ein Einfügen in eine der beiden Datentabellen würde zuerst einen Einsatz in die Pseudo -Index -Tabelle einleiten (und die ID zur Verwendung in der lokalen Tabelle zurückgeben). Ebenso würde ein Löschen aus der lokalen Tabelle einen Löschen aus der Pseudo -Index -Tabelle einleiten. Alle Kindertabellen, die auf einen Elternteil verweisen müssen, weisen auf diese Pseudo -Index -Tabelle hin.

Beachten Sie, dass dies ein Auslöser pro Zeile sein muss und die CRUD in diesen Tabellen verlangsamt. Aber Tabellen wie "Produkt" haben in erster Linie keine sehr hohe DML -Rate. Jeder, der sich über die "Leistungsauswirkungen" beschwert, ist nicht Berücksichtigung der Skala.

Bitte beachten Sie, dass dies als funktionierende Alternative und nicht meine Empfehlung als die bereitgestellt wird Beste Weg

Sie können keinen Primärschlüssel "teilen".

Ohne alle Details zu kennen, ist mein bester Rat, die Tabellen in eine einzelne Produkttabelle zu kombinieren. Optionale Felder, die für einige Produkte besiedelt sind und nicht andere, ist nicht unbedingt ein schlechtes Design.

Eine andere Möglichkeit besteht darin, eine Art Vererbungsmodell zu haben, bei der Sie eine einzelne Produkttabelle haben, und dann zwei Produkttabellen "Subtypen", die auf die Hauptprodukttabelle verweisen und über einen eigenen speziellen Satz von Feldern verfügen. Das Abfragen dieses Modells ist schmerzhafter als eine einzelne Tabelle imho, weshalb ich es als die weniger entsetzliche Option sehe.

Ihre Erklärung ist ein wenig vage, aber aus meinem grundlegenden Verständnis wäre ich versucht, dies zu tun

Die Produkttabelle enthält gemeinsame Felder

product
-------
product_id
name
...

Die Tabelle product_extra1 und die Tabelle product_extra2 enthält verschiedene Felder. Diese Tabellen haben eine ein- zu ein -zu -Eins -Beziehung, die zwischen Product_id und product_extra1.product_id usw. erzwungen wird Seien Sie einzigartig mit einer einzigartigen Einschränkung. Sie müssen sich über die Geschäftsregeln entscheiden, wie diese Daten besiedelt sind

product_extra1
---------------
product_id
extra_field1
extra_field2
....

product_extra2
---------------
product_id
different_extra_field1
different_extra_field2
....

Basierend auf dem, was Sie über der Tabelle product_category haben, befindet sich eine sich überschneidende Tabelle (1 bis viele - viele bis 1), was bedeuten würde, dass jedes Produkt mit vielen Kategorien in Verbindung gebracht werden kann, dies kann jetzt gleich bleiben.

Dies ist ein weiterer Fall von Gen-Spec.

Siehe vorherige Diskussion

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