【发布时间】:2016-02-01 19:37:52
【问题描述】:
假设我们有一个这样的工作表:
- 工作(ID、编号);
假设我们有一个跟踪工作时间的客户请求,我们创建了一个表格,如下所示:
- (A) job_timer(id、job_id、时间戳);
但我们可以选择如何将其绑定到job 表,因此我们也可以:
- (B) job_timer(id、job_number、timestamp);
假设 job_number 是UNIQUE。
我习惯于根据 id 创建外键,所以 A) job_id 将是我所看到的方式。但是,客户正在按工作编号查找工作,如果我直接通过 B)job_number 进行查找,它将为我和数据库节省一些工作。但我应该这样做吗?
使用job_id 时需要做更多工作,即给定工作编号,我只需要使用job_timer 表。当给定job_id 时,我需要绑定两个表——更多的认知编程工作,更多的数据库工作。
请注意,类似的问题 Foreign Key to non-primary key 解决了非主键的唯一性,但我不认为它解决了我的问题。
原始表 (job) 是遗留代码库的一部分,其中 id 和 number 两个字段在整个代码中都被广泛使用,从这个意义上说,我有一个“拆分主键”条件。由于缺乏完整的测试覆盖率,将其剔除将是令人望而却步的。为什么创建 number 字段以及为什么将其设为 varchar 都是很好的问题。我敢肯定在某个时候一定是有原因的。
我正在寻找类似“是的,继续,这完全没问题,在这种情况下没有最佳实践”或“不,如果你这样做,你可能会遇到问题 X , Y, Z 未来”。
【问题讨论】:
-
d'oh,对...多个匹配的父 ID 会模棱两可...我可能应该去睡觉了。
-
如果
job表中的number是唯一的,那么您应该将that 设为主键并完全删除id列(因为它显然不会给表格增加任何价值)。这意味着工作编号也永远不会改变。 -
@horse: 好抓!
id字段是多余的... -
还想补充一点,就我而言...原始表 (
job) 是遗留代码库的一部分,其中id和number两个字段都在整个代码中广泛使用,并且从这个意义上说,我有一个“拆分主键”条件。由于缺乏完整的测试覆盖率,将其剔除将是令人望而却步的。为什么创建number字段以及为什么将其设置为 varchar 是很好的问题。我相信在某些时候一定是有原因的。
标签: sql database database-design foreign-keys