2013-01-21 74 views
1

在我的项目中,我有工作表,其中包含工作发布的信息。每一项工作可以有针对性地(这个信息被存储在JobLocations)如何解决传递性依赖

  1. 只有一个国家,是国家广如:(ID = 1,idCountry = US,idRegion = NULL,idCity = NULL,idJob = 3)
  2. 只有一个区域,是区域宽例如:(ID = 2,idCountry = US,idRegion = TX,idCity = NULL,idJob = 5)
  3. 或更具体的,可以指多个词在当前国家 - 关系>区域
    (ID = 3,idCountry = US,idRegion = TX,idCity = 78,idJob = 7)
    (ID = 4,idCountry = US,idRegion = TX,idCity = 200,idJob = 7)

我创建的一些表是这些。 Job Locations http://imageshack.us/a/img267/5530/joblocations.png 但我可以看到表JobLocations中的传递依赖问题,例如更改idCountry将导致更改idRegion或idCity。

还有什么其他的选择,我必须删除传递依赖关系,并实现上面提到的点1,2,3?

回答

0

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

要区分特殊城市,您可以以某种方式对它们进行编码(例如,负号),或者更准确地说,您可以通过连接向City添加一个类型列。

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

顺便说一句,如果我是你,我会放弃国家,地区和城市的ID列。它们是无用的开销,并通过允许重复名称来引发错误。 JobLocations也不需要id;它将只有JobID和City作为列,其主键包含它们两个。

规则没有工作可以在两个国家很难执行。你需要一个大致为count(city) < 2 where type in ('country','region')的触发器。它比这更复杂,但是你所描述的规则都可以用一个SELECT声明表示。