设计此数据库方案的最佳方法?

puz*_*led 7 sql-server database-design

要求是存储不同实体类型的附件.

假设我们有3个实体类型Company,Department和Employee.每个都可以有多个附件(文档).

哪种方法最好?

解决方案1:

公司表

  • CompanyId

部门表

  • DEPTID

员工表

  • 员工ID

AttchmentType表

  • TYPEID
  • 类型(公司,部门,员工)

附件表

  • 附件ID
  • TypeId(映射到附件类型)
  • entityId(映射到CompanyId/DeptId/EmployeeId)

优点:我将来可以轻松添加新的实体类型

缺点:在这种情况下,我不能在实体和附件之间保持外键关系.

解决方案2:

公司表

  • CompanyId

部门表

  • DEPTID

员工表

  • 员工ID

公司附件表

  • 附件ID
  • CompanyId(FK)

DeptAttachments表

  • 附件ID
  • DeptId(FK)

EmployeeAttachments表

  • 附件ID
  • EmployeeId(FK)

优点:外键完整性

缺点:为了添加新实体,我需要单独添加新的附件表.

那么假设我将来可能需要添加新实体的最佳方式是哪种?


编辑1:

谢谢你们的回复.

如果我想使用解决方案2,我会发现在附件表中创建新列更容易,而不是为每个实体创建新的附件表来映射它们?就像是,

公司表

  • CompanyId

部门表

  • DEPTID

员工表

  • 员工ID

附件

  • 附件ID
  • CompanyId(FK)
  • EmployeeId(FK)
  • DepartmentId(FK)

我在这里错过了什么吗?

Tom*_*m H 5

我肯定会选择解决方案#2.你解决方案#1的专业人士并不是专业人士.如果添加新实体,则必须已经为该实体添加新表,并且您已经在添加或更改现有代码以处理它.您应该能够创建一些处理模式的通用对象,以便重复的代码不是问题.


小智 3

我投票支持解决方案 2,因为这样您就可以以适当的方式强制执行引用完整性。此外,您可以轻松(如果需要)添加特殊附件的字段(例如 EmployeeAttachments 可能有一个位字段“PersonalPicture”或类似字段)