2010-11-21 6 views
1

Mein Lehrer sagte, ich sollte zwei Fremdschlüssel zu einem einzigen Primärschlüssel kombinieren. Aber mein Denkprozess ist, dass das nur eine Kombination jedes Fremdschlüssels erlauben würde.Wann sollte ich zwei Fremdschlüssel als einen einzigen Fremdschlüssel kombinieren?

Stellen Sie sich vor, ich habe ein Produkt, Kauf, KaufDetail.

In PurchaseDetail habe ich zwei Fremdschlüssel, einen für das Produkt und einen für den Kauf. Mein Lehrer sagte, dass ich diese beiden Fremdschlüssel zu einem einzigen kombinieren sollte. Aber kann ein Produkt nicht in vielen verschiedenen Käufen sein? Und viele Einkäufe haben viele Produkte?

Ich bin verwirrt.

Danke!

Edit: Dies ist die SQL, die mein Lehrer sah und gab dann Feedback. Danke für die Anleitung Jungs. (Ich änderte das Wesentliche zu Englisch)

create table Purchase 
(
    ID int primary key identity(1,1), 
    IDCliente int foreign key references Cliente(ID), 
    IDEmpleado int foreign key references Empleado(ID), 
    Fecha datetime not null, 
    Hora datetime not null, 
    Amount float not null, 
) 

create table PurchaseDetail 
(
    ID int primary key identity(1,1), 
    IDPurchase int foreign key references Purchase(ID), 
    IDProductOffering int foreign key references ProductOffering(ID), 
    Quantity int not null 
) 

create table Product 
(
    ID int primary key identity(1,1), 
    IDProveedor int foreign key references Proveedor(ID), 
    Nombre nvarchar(256) not null, 
    IDSubcategoria int foreign key references Subcategoria(ID), 
    IDMarca int foreign key references Marca(ID), 
    Fotografia nvarchar(1024) not null 
) 

create table ProductOffering 
(
    ID int primary key identity(1,1), 
    IDProduct int foreign key references Product(ID), 
    Price float not null, 
    OfferDate datetime not null, 
) 

Vielleicht bin ich über gutes Datenbankschemadesign verwirrt. Danke noch einmal!

+0

Warum möchten Sie das in dem von Ihnen erwähnten Szenario tun? Jedes Beispiel oder Grund? –

+2

Entweder hast du deinen Lehrer falsch verstanden, oder er ist falsch. –

+0

Ja stimme ich Mitch –

Antwort

1

Ich stelle ich vor, er darauf hindeutet:

  • Produkt - ein Primärschlüssel (Produkt-ID), die eine einzigartige Produkt-ID
  • Kauf schon sagt - ein Primärschlüssel (Kauf-ID), die eine eindeutige ID Kaufs impliziert
  • PurchaseDetail - zwei Fremdschlüssel (Produkt-ID), (Kauf-ID), plus eine eindeutige Einschränkung auf (Produkt-ID + Kauf-ID)

plus einige Leute argumentieren, dass alle Tabellen haben sollen ihr eigener Primärschlüssel, der von nichts anderem abhängt (Kaufdetail-ID). Einige DBMS machen dies zwingend erforderlich.

Dies bedeutet, dass Sie in PurchaseDetail nicht zwei Zeilen haben können, die dasselbe Produkt und denselben Kauf haben. Das ist sinnvoll, wenn man davon ausgeht, dass es auf PurchaseDetail auch eine Mengenspalte gibt, so dass ein Einkauf mehr als ein Produkt haben kann.

Beachten Sie, dass es einen Unterschied zwischen eindeutige Einschränkung und Fremdschlüssel gibt. Ein Fremdschlüssel besagt lediglich, dass in der Elterntabelle ein Element mit dieser ID vorhanden sein muss. Dadurch können Sie in der untergeordneten Tabelle so viele Verweise auf dieses Element erstellen, wie Sie möchten. Sie müssen angeben, dass die Spalte oder die Kombination von Spalten eindeutig ist, wenn Duplikate vermieden werden sollen. Ein Primärschlüssel impliziert hingegen eine eindeutige Beschränkung.

Exakte Syntax für die Definition all dies variiert je nach Sprache, aber das sind die Prinzipien.

+0

ich war unter dem Eindruck, dass ein Foriegn Key nur eine Tabelle verweist .... –

+0

Ich bin nicht auf eine bestimmte Sprache/Implementierung, sondern die Menge Theoretische ... –

+0

@Mitch Wheat: Nicht notwendig, aber in diesem Fall sind sie definitiv zwei getrennte Fremdschlüssel. Sie werden nicht kombiniert, um auf eine Tabelle zu verweisen. – Guffa

0

Ich stimme nicht dem einzelnen Schlüssel zu, aber sie könnten ein zusammengesetzter Schlüssel sein (was ich nicht mag). Sie können zwei verschiedene Felder sein, die jeweils auf die ID in den entsprechenden Tabellen beschränkt sind.

Nicht sicher, warum das gleiche Produkt ID mehr als einmal für einen einzelnen Kauf aufgeführt werden müsste? Ist das nicht der Grund, warum Sie die Menge angeben? Vielleicht die Notwendigkeit, eine separate Werbebuchung für einen Einkauf und einen Rabatt zu machen?

0

Ich glaube, thelem hat richtig geantwortet. Aber es gibt noch eine andere Möglichkeit.Sie könnten eine neue Primärschlüsselspalte in die Detailtabelle hinzufügen, so sieht es wie folgt aus:

detail_id int (PK) 
product_id int (FK) 
purchsae_id int (FK) 

Dies ist nicht wirklich notwendig, aber es könnte nützlich sein, wenn Sie jemals brauchen, um die Details Tabelle als referenzieren Fremdschlüssel - mit einem einzigen Primärschlüsselfeld werden kleinere Indizes und Fremdschlüsselverweise erstellt (und sie sind ein wenig einfacher zu schreiben).

0

Vielleicht ist er was auf eine many-to-many-Tabelle, wo es Primärschlüssel der Fremdschlüssel zu den abgebildeten Tabellen zusammen:

PurchaseDetail: 

ProductId   int (FK) 
PurchaseId   int (FK) 
PK(ProductId, PurchaseId) 

Dies kann auch als

PurchaseDetail: 

PurchaseDetailId int (PK, Identity) 
ProductId   int (FK) 
PurchaseId   int (FK) 

modelliert werden Die zweite Form ist nützlich, wenn Sie an anderer Stelle in Ihrem Modell auf Kaufdetails verweisen möchten. Außerdem ist es in einigen RDBMS vorteilhaft, eine PK auf einer monoton steigenden Ganzzahl zu haben.

+0

Das habe ich gemacht, und er gab das Feedback (die Grundlage für diese Frage). Bitte sehen Sie meine Bearbeitung. : P Ich habe getan, was Sie vorschlagen, aber er schien es nicht zu mögen. –

0

Das hängt davon ab, welche Daten Sie darstellen müssen.

Wenn Sie die zwei Fremdschlüssel als Primärschlüssel für das Kaufdetail verwenden, kann ein Produkt nur einmal bei jedem Kauf vorkommen. Ein Kauf kann jedoch immer noch viele Produkte enthalten, und ein Produkt kann immer noch in vielen Käufen auftreten.

Wenn das Kaufdetail mehr Informationen enthält, müssen Sie möglicherweise ein Produkt mehr als einmal bei einem Kauf verwenden. Zum Beispiel, wenn das Kaufdetail Größe und Farbe enthält, und Sie möchten ein rotes T-Shirt Größe XL und ein blaues T-Shirt Größe S.

Verwandte Themen