我想验证表中对外键的正确处理。这是我在下面创建的两个表。一个人可能没有列出地址,所以我希望它为空。否则我想引用地址表中的主键并将其作为外键存储在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,
)
地址表:
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中表
答案 0 :(得分:4)
问题:是否有可能不止一个人住在同一地址?此外,一个人可能住在一个以上的地址吗?
如果是这种情况,请考虑M:N与其他PersonAddress表的关系。
否则,如果不是这种情况,我会问自己“如果没有这个人,你是否更可能没有地址或地址?”目标是确定你是否应该使用Person表或PersonID存储AddressID用地址表?
答案 1 :(得分: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,City和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
然后在Insert表中使用t-sql变量@AddressId的值。您仍然可以在其他SQL语句中使用AddressId进行连接,但是您在City,Zip和Street地址上有一个主键,可以防止您在Address表中插入重复的地址。将此设为 clustered 索引,以防您需要检索或处理一个邮编或一个城市中的所有地址组...