2017-01-30 3 views
0

Ich entwerfe die relationale Datenbank für ein System, das Informationen über bestimmte Arten von Produkten, Einzelhändler und Lieferanten für die Einzelhändler speichert.Datenbankentwurf - Speicherung der Äquivalenz

Einige der Lieferanten verkaufen die gleichen Produkte - aber sie einen Standard haben die Produkte nicht zur Identifizierung des Lieferanten A bedeutet ein Produkt mit ID haben könnte 618.261, dem Produktlieferanten B entsprechen 007162.

Das Problem ist, ich möchte das gleiche Produkt nicht mehrmals für verschiedene Lieferanten speichern. Derzeit habe ich die folgenden Tabellen:

Äquivalenz

  • supplier1_id
  • supplier2_id
  • supplier1_product_id
  • supplier2_product_id

Produkt

  • id (generiert)
  • SUPPLIER_ID
  • supplier_product_id

Dies scheint wie eine schlechte Idee. Wann immer etwas in ‚Produkt‘ eingefügt,

  1. ‚Gleichwertigkeit‘ abgefragt werden muss jede Äquivalenz
  2. ‚Produkt‘ zu finden ist zu finden abgefragt werden, wenn gleichwertige Produkte bereits
  3. gespeichert werden, wenn Mittel werden nicht gefunden kann das Produkt eingefügt werden

Gibt es eine klügere Möglichkeit, dies zu tun?

Antwort

1

Dies ist kein ungewöhnliches Szenario, verschiedene Lieferanten haben oft ihre eigenen SKU-Nummern für ein gemeinsames Produkt. Zusätzlich kann ein Produkt verschiedene Hersteller mit jeweils eigenen Teilenummern haben. Aber schauen wir uns nur die Lieferanten an.

In einfachem Englisch, ein Lieferant kann viele Produkte liefern und ein Produkt kann von vielen Lieferanten verfügbar sein. Diese Viele-zu-Viele-Beziehung wird über eine Kreuz- oder Schnittstellentabelle aufrechterhalten. Wenn Sie darüber nachdenken, ist die SKU-Nummer kein Attribut der Produkteinheit oder der Lieferanteneinheit. Stattdessen ist es ein Attribut der Beziehung. Ja, Beziehungen können Attribute haben wie jede andere Entität.

create table ProductSupplier(
    ProductID int not null references Products(ID), 
    SupplierID int not null references Suppliers(ID), 
    UnitPrice currency not null, 
    SKU   varchar 
); 

Der Einheitspreis könnte eine Liste der Stückpreise sein, die je nach bestellter Menge variieren würden. Daher wäre es wahrscheinlich in einer anderen Tabelle - ich habe es hier hinzugefügt, um ein zusätzliches Lieferanten-Produkt-Beziehungsattribut zu zeigen.

wieder in einfachem Englisch, ein Tupel aus dieser Tabelle sagt: "dieses Produkt aus dieser Lieferanten hat diese SKU-Nummer."