2016-06-02 21 views
0

Ich brauche einen Design-Vorschlag von allen Ihnen ExpertenComposite-Primärschlüssel und Fremdschlüssel-Beziehung

Also ich Tabellen wie folgt:

Tabelle 1

(A integer not null 
, B char(1) not null 
, C integer not null 
, D not null 
, primary key (A, B, C) i.e. composite key 
) 

Tabelle 2

(A integer not null 
, B char(2) not null 
, C integer not null 
primary key (A, B,C) composite key 
) 

Tabelle 3

(A integer not null 
, B char(2) not null 
, D not null 
primary key (A, B, D) 
) 

Ich mag eine Beziehung zwischen Tabelle 1 und 2 und Tabelle 1 und die Tabelle übergeordnete Tabelle und Tabelle 2 und 3 ist das Kind der Tabelle zu seinem 3.

Tabelle 1 erstellen 1. Ich Beziehung einfach erstellen kann zwischen Tabelle 1 und Tabelle 2, aber ich erhalte einen Fehler, wenn ich versuche, eine Beziehung zwischen 1 und 3 zu erstellen, da der Fremdschlüssel nicht Teil des zusammengesetzten Schlüssels sein kann und der ganze zusammengesetzte Schlüssel sein muss. Ich würde alle Vorschläge sehr schätzen.

+3

Nun ... durch die Definition eines Fremdschlüssels können Sie nicht nur einen Teil des Primärschlüssels verwenden. Nehmen Sie Ihr Beispiel und sagen Sie, dass Sie A als Fremdschlüssel verwenden wollten. Aber es gibt 10 Zeilen in Tabelle1 mit diesem Wert. Zu welcher Zeile gehört der Fremdschlüssel? Es ergibt keinen logischen Sinn. Vielleicht, wenn Sie Ihre Situation mit einer Bedeutung anstelle von Tabelle1, ColA erklären könnten, können wir helfen. –

+0

Einige Spaltentypen darin fehlen - wird DDL tatsächlich ausgeführt? –

+0

Wenn Sie einen "UNIQUE" -Index zu Tabelle 1 für die Spalten A, B, D hinzufügen, können diese drei Spalten als Fremdschlüssel für Tabelle 3 verwendet werden ... Wenn diese drei in T1 nicht eindeutig sind, dann bilden sie kein a * Schlüssel * in der Tabelle, daher können sie kein Fremdschlüssel in einer anderen Tabelle sein. – user1429080

Antwort

0

Ist das was du suchst?

create table table1 (
    A int not null , 
    B char(1) not null , 
    D int not null , 
    constraint pkTable1 primary key clustered (A , B , D) 
    ) 
create table table2 (
    A int not null , 
    B char(1) not null , 
    C int not null , 
    constraint pkTable2 primary key clustered (A , B , C) , 
    constraint [email protected] foreign key (A , B , C) references table1 (A , B , D) 
    ) 
create table table3 (
    A int not null , 
    B char(1) not null , 
    D int not null , 
    constraint [email protected] foreign key (A , B , D) references table1 (A , B , D) 
    ) 

Beachten Sie die foreign key (A , B , *D*) Stück. Nicht sicher, ob Sie einen Primärschlüssel für Tabelle 2 haben oder nicht, basierend auf dem Wortlaut der Frage, aber da ist es sowieso.

Alles, was gesagt, wenn table2 ist untergeordnete-table1, würde meine Neigung wie etwas zu tun:

create table table1 (
    t1ID int identity(1,1) not null , 
    constraint [email protected] unique nonclustered (t1ID) , 
    A int not null , 
    B char(1) not null , 
    C int not null , 
    constraint pkTable1 primary key clustered (A , B , C) 
    ) 
create table table2 (
    t2ID int identity(1,1) not null , 
    constraint [email protected] unique nonclustered (t2id) , 
    t1ID int not null , 
    constraint [email protected] foreign key (t1ID) references table1 (t1ID) 
    ) 
create table table3 (
    t3ID int identity(1,1) not null , 
    constraint [email protected] unique nonclustered (t3id) , 
    t1ID int not null , 
    constraint [email protected] foreign key (t1ID) references table1 (t1ID) 
    ) 

auf Präferenz Je (einige Leute es vorziehen, nicht-sensical Primärschlüssel, einige Primärschlüssel bevorzugen Dies kann für einen Menschen ein gewisses Maß an Sinn ergeben.) Sie könnten die eindeutigen Indizes der Identitätsfelder durch Primärschlüssel ersetzen und sicherstellen, dass Sie einen eindeutigen Index (A, B, C) platzieren, um die Datenintegrität sicherzustellen.

+0

Hat meine Frage dich verwirrt? Weil Sie die Spalte D völlig ignoriert haben – SQLSERVERDAWG

+0

Nun, vielleicht hat es - haben Sie bemerkt, dass ich Spalte D drin als Teil der Beziehung eingeschlossen habe? Ansonsten habe ich deine Frage vermisst - kannst du das klären? –

Verwandte Themen