2013-04-10 10 views
8

Ich möchte die ordnungsgemäße Behandlung von Fremdschlüsseln in der Tabelle überprüfen. Hier sind meine zwei Tabellen, die unten erstellt werden. Es ist möglich, dass eine Person keine Adresse hat, also möchte ich, dass sie null ist. Ansonsten würde ich gerne einen Primärschlüssel aus der Adresstabelle referenzieren und ihn als Fremdschlüssel in der Personentabelle ablegen. Es ist auch möglich, dass wir ein Adressobjekt ohne eine Person haben.SQL Server Tabelle mit Fremdschlüssel erstellen

Tabelle für eine Person:

CREATE TABLE Person 
(
    PersonID int IDENTITY PRIMARY KEY, 
    FName varchar(50) NULL, 
    MI char(1) NULL, 
    LName varchar(50) NULL, 
    AddressID int FOREIGN KEY REFERENCES Address(AddressID) NULL, 
) 

Tisch Adresse:

CREATE TABLE Address 
(
    AddressID int IDENTITY PRIMARY KEY, 
    Street varchar(60) NULL, 
    City varchar(50) NULL, 
    State varchar(2) NULL, 
    Zip varchar(10)NULL, 
    Intersection1 varchar(60) NULL, 
    Intersection2 varchar(60) NULL, 
) 

Auch Q2 Ich habe noch nie mit Trigger gearbeitet, aber ich gehe davon aus, die Art und Weise, einen Einsatz zu handhaben wäre ein zu verwenden, gespeicherte Prozedur zum Einfügen der Adresse zuerst, erhalten Sie den Primärschlüssel, dann übergeben Sie es an eine gespeicherte Prozedur, um in die Personentabelle einzufügen?

+1

Sieht gut für mich aus, obwohl "Adresse" zuerst erstellt werden sollte. –

+0

Sind Sie sicher, dass dieses Design erforderlich ist? Wie viele Leute haben die gleiche Adresse? Das wäre der einzige Grund, warum Sie einen Fremdschlüssel für eine Adresstabelle benötigen. Ansonsten verwende einfach die PersonID als PK in deiner Adressentabelle. –

+1

Stimmen Sie mit @ElectricLlama überein. Vielleicht möchten Sie das Design in Betracht ziehen. Normalerweise würden Sie die PersonID in die Adresstabelle aufnehmen und auf diese Weise mit der Tabelle "Person" referenzieren, und im wirklichen Leben kann eine Person mehrere Adressen haben. – Elmer

Antwort

4

Frage für Sie: ist es möglich, dass mehr als eine Person lebt unter der gleichen Adresse? Ist es auch möglich, dass eine Person an mehr als einer Adresse lebt?

Wenn dies der Fall ist, betrachten Sie die M: N-Beziehung mit der zusätzlichen PersonAddress-Tabelle.

Ansonsten, wenn dies nicht der Fall ist, würde ich mich fragen "ist es wahrscheinlicher, dass Sie Person ohne eine Adresse oder Adresse ohne die Person haben?" Ziel ist es, festzustellen, ob Sie AddressID mit Person Tabelle oder speichern sollten PersonID mit Adresstabelle?

1

würde ich Adresse wie folgt ändern:

CREATE TABLE Address 
(
    AddressID int IDENTITY, 
    Street varchar(60) NULL, 
    City varchar(50) NULL, 
    State varchar(2) NULL, 
    Zip varchar(10)NULL, 
    Intersection1 varchar(60) NULL, 
    Intersection2 varchar(60) NULL, 
) 
Alter Table Address Add Constraint 
PK_Addresses Primary Key Clustered 
(City Asc, Zip Asc, Street asc) 

Create Unique NonClustered Index IX_Address_Key 
On Address{AddressId) 

Ich würde dies tun, weil, dann, wenn Sie eine Person mit einer bestimmten Street, Stadt hinzufügen und Zip, Sie dies in einer SavePerson Stored proc tun können .

If Exists (Select * From Address 
      Where Street = @Street 
       And City = @city 
       And Zip = @zip) 
    Begin 
     Select @AddressId = AddressId 
     From Address 
     Where Street = @Street 
      And City = @city 
      And Zip = @zip 
    End 
Else Begin 
     Insert Address(Street, City, State, Zip) 
     Values(@street, @city, @state, @zip) 
     Set @AddressId = Scope_Identity() 
    End 

Und dann den Wert des T-SQL-Variable @AddressId in Ihrem Einfügen in die Tabelle Person verwenden. Sie würden weiterhin die AddressId für Joins in anderen SQL-Anweisungen verwenden, aber Sie verfügen über einen Primärschlüssel für die Adresse "City", "Zip" und "Street", der verhindert, dass doppelte Adressen in die Adresstabelle eingefügt werden. Machen Sie diese Clustered Index für den Fall, dass Sie Gruppen von Adressen abrufen oder verarbeiten müssen, die alle in einer Zip sind, oder alle in einer Stadt ...

+0

Es tut mir leid, aber ich sehe keinen Nutzen in Bezug auf diese Änderungen.In der Tat - ich habe Identität Spalte, die nicht PK zur gleichen Zeit ist - zuerst höre ich von einer solchen Idee. Alles, was in SP erwähnt wird, kann in gleicher Weise mit dem ursprünglichen Entwurf durchgeführt werden, und wenn es eine Notwendigkeit für die Einzigartigkeit von Stadt-, Straßen- und Zip-Spalten gibt, kann dies mit einer einzigartigen Beschränkung erfolgen. Es ist auch wahrscheinlicher, dass die Tabelle Address von AddressID (Adresse für Person - und Joins) und dann von City, State und Zip durchsucht wird und somit viel besser für Clustered-Index geeignet ist. PS: PK auf Nullable-Spalten ist auch nicht möglich. –

Verwandte Themen