Database design 如何解决传递依赖

Database design 如何解决传递依赖,database-design,Database Design,在我的项目中,我有一个Job表,其中保存了职位发布的信息。每个作业都可以针对(此信息存储在作业位置): 只有一个国家,必须是全国性的,例如:(id=1,idCountry=US,idRegion=null,idCity=null,idJob=3) 只有一个地区,是地区范围的,例如:(id=2,idCountry=US,idRegion=TX,idCity=null,idJob=5) 或更具体地说,可以指当前国家/地区的多个城市->地区 (id=3,idCountry=US,idRegion=T

在我的项目中,我有一个Job表,其中保存了职位发布的信息。每个作业都可以针对(此信息存储在作业位置):

  • 只有一个国家,必须是全国性的,例如:(id=1,idCountry=US,idRegion=null,idCity=null,idJob=3)
  • 只有一个地区,是地区范围的,例如:(id=2,idCountry=US,idRegion=TX,idCity=null,idJob=5)
  • 或更具体地说,可以指当前国家/地区的多个城市->地区
    (id=3,idCountry=US,idRegion=TX,idCity=78,idJob=7)
    (id=4,idCountry=US,idRegion=TX,idCity=200,idJob=7)
  • 我创建的一些表如下所示。 但我可以看到表JobLocations中的传递依赖性存在问题,例如更改idCountry将导致更改idRegion或idCity


    要消除过渡依赖关系并实现上述第1点、第2点、第3点,我还有什么其他选择?

    解决这个问题的一个方法是在每个地区有两个“特殊”城市,一个表示“该地区的任何地方”,另一个表示“该国的任何地方”。
    JobLocations
    中的城市代码用于指示工作的区域性(如果愿意)

    为了区分特殊的城市,您可以以某种方式对它们进行编码(例如,负ID),或者更准确地说,将类型列添加到通过联接查找的
    City

    设置特殊城市后,可以从
    JobLocations
    中删除区域和国家/地区FK列

    顺便说一句,如果我是你,我会删除来自国家、地区和城市的id列。它们是无用的开销,允许重复的名称会导致错误<代码>工作地点也不需要id;它将只有JobID和City作为列,其主键包括这两个列

    在两个国家都不能有工作的规定很难执行。您将需要一个触发器,该触发器显示大致
    count(city)<2 where输入('country','region')
    。它比这更复杂,但是您描述的规则都可以表示为一个
    SELECT
    语句