不知道这种问题是否适用于stackoverflow(我刚刚做了一个帐户),但是我会给它一个机会。如果合适,请重定向我。我已经尝试过一些搜索这种情况的方法,但是老实说我不知道如何描述它。我不确定是否有一些术语描述我想要的东西。谢谢。
我正在使用MySQL,但我认为这是一个通用的数据库问题。我需要创建一组表,这些表将允许存储以下信息,而不会发生冲突,孤立或冗余。我已将我的特定示例替换为我认为会更广泛理解的类似数据:
表(仅包括重要字段):
有工人,每个工人都有职位属性,还有雇主
1)工人
工号(pk)
PositionID(fk-位置)
2)职位
PositionID(pk)
3)雇主
雇主编号(pk)
这些雇主可以担任任何职位。雇主与职位之间存在多对多的关系(由链接表“标题”表示),但是这些职位中的任何一个在不同的雇主处都有不同的头衔。因此,雇主和职位的任何组合都可以存在,并具有该组合的特定标题。
职称
PositionID(联合pk; fk-位置)
EmployerID(联合pk; fk-雇主)
标题名称
同样,任何工人都可以分配给任意数量的雇主。工人与雇主之间存在多对多关系(由“分配”链接表表示),但只能将工人分配给具有其职位头衔的雇主。因此,我建立了将工作人员链接到标题的链接表。
作业
WorkerID(联合pk; fk-工人)
PositionID(联合pk;联合fk-标题)
EmployerID(联合pk;联合fk-标题)
这种设置类似于您是一家订约代理公司,有一组要外包的工人,每个工人都有不同的“职位”或资格级别,比如说。然后,您有一组用人单位,每个用人单位对这些职位使用不同的术语。当您将一名工人分配给雇主时,他们的“职位”必须与该雇主中该职位的“职位”相匹配。希望这不会太令人困惑。
我尝试了不同的设置,但是最终总是得到可以想象冲突空间的东西(并且我想避免冗余,孤立的可能性,应用程序级验证或触发器)。上面是尝试创建最佳方案的最佳镜头,但是如果未插入/更新/删除记录,则表关系中存在一条分支路径,对于给定的SELECT查询,这可能会导致两个不同(冲突)的结果。正确地。
例如分配中的记录可能会将工作人员分配给与他/她的职位不匹配的标题。
请考虑以下记录集:
工人:
WorkerID:1,PositionID:1
职位:
PositionID:1;
职位编号:2
雇主:
雇主编号:1
职称:
PositionID:1,EmployerID:1,TitleName:“初级程序员”;
职位ID:2,雇主ID:1,职位名称:“高级程序员”
作业:
工人编号:1,职位编号:2,雇主编号:1
在这种情况下,没有外键冲突,我担心这种记录可能会进入数据库。在这种情况下,一个工作人员(WorkerID:1,PositionID:1)被分配给另一个职位的标题(PositionID:2,EmployerID:1)。
我知道我可以在应用程序级别执行一些验证步骤来确保没有冲突,但是我想知道是否有一种方法可以构建表和关系,但首先不要这样做。
谢谢阅读。
最佳答案
您可以添加表格“资格”来将工作人员链接到标题吗?如果您尝试上述方案,则与该复合键上的资格表相关联的“任务”中的fk应该会失败。
我会在评论中问这个问题,但是我还没有足够的声誉,所以我不得不提出答案。
关于mysql - 关系数据库中的最佳表设置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27696435/