首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在表和多到多关系表之间创建关系

如何在表和多到多关系表之间创建关系
EN

Database Administration用户
提问于 2015-01-02 14:40:27
回答 1查看 574关注 0票数 3

我正在Sql server 2008 r2中构建一个新的数据库。我有以下表和业务规则:

  • 有预定义级别的技能,如初级,高级,经理。
  • 工作人员将被分配到一定的技能水平。

例如,在ym系统中,我将获得这样的信息;staff A通过高级级别连接到名为“Sql server 20082”的技能。

目前,我已将各表之间的关系设置如下:

但是我有这样的担心,目前我通过一个多对多的表(技能级)来存储技能和级别之间的关系,而我通过一个多对多的表(SkillLevelStaff)来存储员工和技能之间的关系。但是在表上,我存储了相同的关系skillId+LevelID,它已经在SkillLevel表中定义了。有谁能对此提出建议吗?例如,我是否应该为SkillLevel表和setit创建另一个系统生成的ID,作为PK而不是SkillID+LevelID?谢谢

EN

回答 1

Database Administration用户

发布于 2015-01-02 15:07:28

一般来说,我认为多到多对多对多的表没有什么问题,在这里,您拥有所有三个ID。但是,在本例中,SkillLevel表上有额外的列,这意味着Skill+Level对具有自己的唯一属性。考虑到我将继续创建一个额外的SkillLevelID列并在您的SkillLevelStaff表中使用它。

无论您是否使用SkillLevelID作为主键,都要复杂得多。老实说,在我看来,到头来这并不重要。如果使用外键,则至少需要SkillLevelID上的唯一键,并且需要在SkillID + LevelID对上至少有一个唯一的键,以强制执行组合是唯一的业务规则。关键是哪一个并不重要。另一方面,聚集索引将很重要。如果您执行大多数连接到SkillLevelStaff表的查询,那么使用代理键(SkillLevelID)可能是个好主意,它肯定会避免碎片化。另一方面,像SkillLevel这样的东西可能不会经常更新,所以使用自然密钥(SkillID + LevelID)所造成的碎片数量可能是最小的。但是,如果大多数查询使用SkillID或SkillID + LevelID作为WHERE子句的一部分(或连接到这些表),情况会更好。你可能会想在那里做些实验。

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/87436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档