多对多的表设计问题

时间:2010-03-13 20:21:31

标签: sql sql-server database database-design

最初我的DB,[Property]和[Employee]中有两个表。

每位员工都可以拥有一个“家庭财产”,因此员工表中有一个属性的HomePropertyID FK字段。

后来我需要对这种情况进行建模,尽管只有一个“家庭财产”,但员工确实在多个房产工作或覆盖多个房产。

所以我创建了一个[Employee2Property]表,其中包含EmployeeID和PropertyID FK字段来模拟这种多对多关系。

现在我发现我需要在员工和财产之间创建其他多对多关系。例如,如果有多个员工是属性的经理,或者是多个员工,他们在房产等处执行维护工作。

我的问题是:

  1. 我应该为每种情况创建单独的多对多表,还是应该再创建一个像[PropertyAssociatonType]这样的表,列出员工可以与属性关联的类型,只需添加一个FK字段即可[Employee2Property]如PropertyAssociationTypeID解释了什么是关联?我对优点/缺点感到好奇,或者是否还有另一种更好的方式。
  2. 我是愚蠢的,这一切都错了吗?
  3. 感谢您的任何建议:)

3 个答案:

答案 0 :(得分:2)

这是一个非常有效的问题。答案是:它取决于

以下内容建议使用单个“键入的”M:N关系:

  • 您经常希望处理所有员工 - 财产关系,与类型
  • 无关
  • 关联的数量一直在变化,即新类型的发明。
  • 员工财产关系有时会改变其类型。

如果这些陈述更加错误,那么你最好使用不同的关系。

答案 1 :(得分:0)

两个注意事项应该指导您的选择。

  1. 潜在关联类型列表的静态程度如何?你已经不得不添加新的,所以似乎这里的答案可能是 - 不是很好。如果此列表有可能增长,请坚持选择B(一个附加FK的表到AssociationType表)

  2. 这些数据的访问模式可能是什么?如果需要访问与所有其他类型隔离的各种类型的关联,那么多个表可能会更好。但我只会做这个关联类型列表也非常静态

答案 2 :(得分:0)

Create Table Employee
(
    Id int not null Primary Key
    , ....
)
Create Table Property
(
    Id int not null Primary Key
    , ....
)
Create Table Role
(
    Name varchar(10) not null Primary Key
    , ....
)

在角色表中,您可以输入“经理”等内容。

Create Table PropertyEmployeeRoles
(
    PropertyId int not null
    , EmployeeId int not null
    , RoleName varchar(10) not null
    , Constraint FK_PropertyEmployeeRoles_Properties
        Foreign Key( PropertyId )
        References dbo.Properties( Id )
    , Constraint FK_PropertyEmployeeRoles_Employees
        Foreign Key( EmployeeId )
        References dbo.Employees( Id )
    , Constraint FK_PropertyEmployeeRoles_Roles
        Foreign Key( RoleName )
        References dbo.Roles( Name )
    , Constraint UK_PropertyEmployeeRoles Unique ( PropertyId, EmployeeId, RoleName )
)

通过这种方式,同一名员工可以在同一财产上担任多个角色。这种结构不适用于您需要保证只有一个项目(例如HomeProperty)的情况,但允许您扩展员工可能拥有的与给定属性相关的角色列表。