說我有一個數據庫有多個權利,如person, company, conference
,你必須跟蹤說addresses
。我們可以爲同一個實體(人)提供多個地址。一種方法是爲每個實體分配一個單獨的地址表(person_address等)。另一種方法是擁有一個包含主鍵的地址表(Entity,id,address_type
)。在這種方法中,我們不能使用地址表中的外鍵到實體。數據庫設計SQL Server
那麼有什麼更好的方法。有沒有另一種方法來做到這一點?
感謝
說我有一個數據庫有多個權利,如person, company, conference
,你必須跟蹤說addresses
。我們可以爲同一個實體(人)提供多個地址。一種方法是爲每個實體分配一個單獨的地址表(person_address等)。另一種方法是擁有一個包含主鍵的地址表(Entity,id,address_type
)。在這種方法中,我們不能使用地址表中的外鍵到實體。數據庫設計SQL Server
那麼有什麼更好的方法。有沒有另一種方法來做到這一點?
感謝
在邏輯建模POV中,您的描述強調了像person
,company
,conference
等實體具有共同特徵的事實:它們具有零個,一個或多個地址。如果您將此類建模爲類層次結構,那麼您可能會創建一個Addressable
類,並且會從此Addressable類繼承人員,公司和會議。您可以將相同的推理應用於您的數據模型,並將addresable
表與addressable_entity_id
配合使用。 person
,company
,conference
實體將「繼承」此表。有三種設立方式實現表繼承:
所以你可以模擬你這樣的表:
create table Addresses (AddressId int not null identity(1,1) primary key, ...);
create table Addressable (AddressableId int not null identity (1,1) primary key, ...);
create table AddressableAddress (
AddressId int not null,
AddressableId int not null,
constraint AddressableAddressAddressId
foreign key (AddressId) references Addresses(AddressId),
constraint AddressableAddressAddressableId
foreign key (AddressableId) references Addressable(AddressableId));
create table Person (PersonId int not null identity(1,1) primary key,
AddressableId int not null,
...,
constraint PersonAddressableAddressableId
foreign key AddressableId references Addressable (AddressableId));
create table Company (CompanyId int not null identity(1,1) primary key,
AddressableId int not null,
...,
constraint CompanyAddressableAddressableId
foreign key AddressableId references Addressable (AddressableId));
當然你必須找到絕對之間的平衡e關係正常形式和實際可用性。在這個方案中,我建議例如爲了插入一個新的人,必須先在Addressable中獲得一行,然後獲取AddressableId,然後繼續插入該人。這可能或可能也不起作用。順便說一句,有是的方式在一個單獨的語句來完成這樣的插入使用OUTPUT子句鏈兩個插件:
insert into Addressable (AddressableType)
output inserted.AddressableId, @FirstName, @LastName
into Person (AddressableId, FirstName, LastName)
values (AddressableTypePerson);
但現在很難獲取新插入的PersonId
。
從技術上講,如果兩個人住在同一個地址,你不會是完全標準化的,如果根本就在TBLPerson
行稱爲TBLAddress
但是單一個一對多的詳細表,如果你只想每個物理地址一個實例,你將招致一個多對多關係表TBLPersonAddresses
的開銷,其中FK的對TBLAddress
我會說,除非你希望在同一個地址的多個人是我的標準將TBLAddress
與personID
列作爲01的詳細信息
編輯:我傾向於總是使用代理鍵,除非我有特別的理由不這樣做。
at 2000 rep,你已經足夠長時間知道比標記一個問題'sql'和'server' –