数据库设计的SQL Server

说我有多个授权如数据库person, company, conference ,而您必须跟踪说出addresses 。 我们可以有相同的实体(人)多个地址。 一种方法是为每个实体一个单独的地址表(person_address等)。 另一种方法是有具有主键(一个地址表Entity,id,address_type )。 在这种方法中,我们不能使用从地址表的外键的实体。

那么,什么是更好的方法。 是否有另一种方式来做到这一点?

谢谢

--------------解决方案-------------

在一个逻辑建模POV的描述强调了这一事实,如实体personcompanyconference等有一个共同的特点:它们具有零个,一个或多个地址。 如果您将这个模型作为一个类层次结构,也许你会创建一个Addressable类,并有个人,公司和会议继承这个寻址类。 您可以将同样的道理,以数据模型,并有addresable表的addressable_entity_id 。 该personcompanyconference实体将“继承”此表。 有三种实现表继承方式确定:

  • 班表继承
  • 单表继承
  • 混凝土表继承

所以,你可以模拟你的表是这样的:

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

当然,你必须要找到之间的绝对关系的正常形态和实际实用性的平衡。 在这个方案我为了插入一个新的人一提出实例必须先在寻址一排,让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作为一个详细的TBLPerson

编辑:我倾向于总是使用代理键,除非我有特别的理由不这样做。

分类:SQL服务器 时间:2015-03-15 人气:1
本文关键词: SQL服务器
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.532 (s). 10 q(s)