2013-04-10 4 views
8

Я хочу проверить правильность обработки внешних ключей в таблице. Вот мои две таблицы, созданные ниже. Возможно, у человека может не быть указанного адреса, поэтому я хочу, чтобы он был нулевым. В противном случае я хотел бы ссылаться на первичный ключ из таблицы адресов и хранить его в таблице Person как внешний ключ. Возможно также, что у нас может быть адресный объект без человека.SQL Server Создать таблицу с внешним ключом

Стол для лица:

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, 
) 

Таблица для Адрес:

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, 
) 

Также Q2 я никогда не работал с триггерами, но я предполагаю, что способ обработки вставки будет использовать хранимую процедуру, чтобы сначала вставить адрес, получить первичный ключ, затем передать его в хранимую процедуру для вставки в таблицу Person?

+1

Выглядит хорошо, хотя сначала нужно создать «Адрес». –

+0

Вы уверены, что этот дизайн не требуется? Сколько людей имеют одинаковый адрес? Это будет единственной причиной, по которой вы хотите, чтобы внешний ключ находился в таблице адресов. В противном случае просто используйте PersonID как PK в вашей адресной таблице. –

+1

Согласен с @ElectricLlama. Возможно, вы захотите рассмотреть дизайн. Обычно вы помещаете PersonID в таблицу Address и ссылаетесь на это с помощью таблицы Person, таким образом, и в реальной жизни человек может иметь несколько адресов. – Elmer

ответ

4

Вопрос для вас: возможно ли, что более одного человека живет по тому же адресу? Кроме того, возможно ли, что один человек живет по нескольким адресам?

Если это так, рассмотрите отношения M: N с дополнительной таблицей PersonAddress.

Иначе, если это не так, я спрашивал себя: «Скорее всего, у вас будет человек без адреса или адреса без человека?» Цель состоит в том, чтобы определить, следует ли хранить AddressID с таблицей Person или Личный идентификатор с адресной таблицей?

1

Я хотел бы изменить адрес, как это:

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) 

Я хотел бы сделать это, потому что, то, когда вы добавляете человека с указанным StreetAddress, Город и Zip, Вы можете сделать это в SavePerson ХП ,

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 

И затем использовать значение T-SQL переменной @AddressId в вашей вставки в таблицу Person. Вы все равно будете использовать AddressId для объединений в других операторах SQL, но у вас есть первичный ключ на адресах City, Zip и Street, который не позволит вам вставлять повторяющиеся адреса в таблицу Address. Сделайте это сгруппированным индексом в случае, если вам, возможно, потребуется получить или обработать группы адресов, которые находятся в одном почтовом индексе, или все в одном городе ...

+0

Прошу прощения, но я не вижу никакой пользы в внесении этих изменений.Фактически - столбец Identity, который не является PK в одно и то же время - сначала я слышу о такой идее. Все, что упоминается в SP, можно сделать в равной степени с оригинальным дизайном, и если есть необходимость в уникальности в столбцах City, Street и Zip, это может быть сделано с уникальным ограничением. Также более вероятно, что адрес таблицы будет просмотрен AddressID (найти адрес для человека - и присоединяется), а затем по городу, штату и почтовому индексу, что делает его гораздо лучшим кандидатом для кластеризованного индекса. PS: Наличие PK в столбцах с нулевым значением также невозможно. –

Смежные вопросы