关系数据库中的最优表设置

时间:2014-12-29 21:38:23

标签: mysql sql

不确定这类问题是否适合stackoverflow(我只是创建了一个帐号),但我会给它一个机会。如果合适,重定向我。我已经尝试了一些搜索这个场景,但老实说我不知道​​除了长篇文章之外如何描述它。我不确定是否有一些术语描述了我想要的东西。感谢。

我正在使用MySQL,但我认为这是一个普通的DB问题。我需要创建一组表,以便存储以下信息,不存在冲突,孤立或冗余的可能性。我已经用我认为会更普遍理解的类似数据取代了我的具体例子:

表格(仅包括重要字段):

有工人,每个工人都有职位属性,还有雇主

1)工人

  • WorkerID(pk)
  • PositionID(fk - 职位)

2)职位

  • PositionID(pk)

3)雇主

  • EmployerID(pk)

这些雇主可以包括任意数量的职位。雇主和职位之间存在多对多的关系(由链接表"标题"表示),但这些职位中的任何一个在不同的雇主中可能有不同的职位。因此,雇主和职位的任何组合都可能存在,具有该组合的特定标题。

标题

  • PositionID(关节pk; fk - 位置)
  • EmployerID(联合PK; fk - 雇主)
  • TITLENAME

此外,任何工人都可以分配给任意数量的雇主。工人和雇主之间存在多对多的关系(由链接表"分配"表示),但工人只能被分配给拥有其职位头衔的雇主。所以我建立了链接表来链接工人和标题。

分配

  • WorkerID(联合PK; fk - 工人)
  • PositionID(关节pk;联合fk - 标题)
  • EmployerID(联合PK;联合fk - 标题)

这个设置类似于你是一个承包代理机构,其中有一组工人要外包,每个人都有不同的职位和资格等级,让我们说。然后你有一套雇主,每个雇主对这些职位使用不同的术语。当您将一名工人分配给雇主时,他们的职位是"必须匹配"位置"该雇主中的那个头衔。希望这不会让人感到困惑。

我尝试了不同的设置,但我总是想到一些可以想象冲突的空间(我想避免冗余,孤立的可能性,应用程序级别的验证或触发器)。以上是尝试创建最佳方案的最佳方法,但如果未插入/更新/删除记录,则表关系中存在分叉路由,可能导致给定SELECT查询的两个不同(冲突)结果正确。

e.g。作业中的记录可以将工人分配给与他/她的位置不匹配的标题。

考虑以下记录集:

工:

  • WorkerID:1,PositionID:1

职位:

  • PositionID:1;
  • PositionID:2

雇主:

  • 雇主ID:1

标题

  • PositionID:1,EmployerID:1,TitleName:" Junior Programmer";
  • PositionID:2,EmployerID:1,TitleName:"高级程序员"

作业:

  • WorkerID:1,PositionID:2,EmployerID:1

在这种情况下没有外键违规,我担心这种记录可能会进入数据库。在这种情况下,工作人员(WorkerID:1,PositionID:1)被分配给位于不同位置的标题(PositionID:2,EmployerID:1)。

我知道我可以在应用程序级别执行验证步骤,以确保没有冲突,但我想知道是否有一种方法来构建表和关系,而不是首先允许它。

感谢阅读。

1 个答案:

答案 0 :(得分:0)

您是否可以添加表'资格'来将工作人员链接到标题?如果您尝试相关方案,那么与该复合键上的资格表绑定的“赋值”中的fk将失败。

我会在评论中提出这个问题,但我还没有足够的声誉,所以我不得不问答。