我应该在任务表中使用哪个主ID

时间:2016-01-02 15:42:41

标签: mysql

你会看到我的问题很简单,但我不知道索引条目的更好方法是什么。以非常简单的方式,我有四个表'汽车','公司','companyCars'和'companyTasks'。

'Table cars
carid INT PRIMARY
carname TINYTEXT

'Table companies
compid INT PRIMARY
compName TINYTEXT

'Table companyCars
compcarid INT PRIMARY
compid INT
carid INT

'Table companyTasks
taskid INT PRIMARY
compid
carid INT
taskDescr TEXT
...

获得与我的汽车关系的更好方法是什么?在公司的桌面表中,最好是查看companyCars Table(以及compcarid),或者更好地(以直接的方式)使用companyTasks Table中的carid。

问题是,只有与公司相关的公司汽车表的汽车才允许在公司的桌子上使用。

希望你能帮我找到最好的方法。

seehma

2 个答案:

答案 0 :(得分:1)

我会探索一个选项:

如果companyCars表是"关系的实现"而不是"实体",我会考虑将该表的PRIMARY KEY作为复合键... (compid, carid)

如果出于某种原因需要PRIMARY KEY成为简单的整数compcarid列,那么至少在(compid,carid)上放置一个UNIQUE约束(唯一索引)。

无论哪种方式,companyTasks的外键约束都可以引用复合键。

  CONSTRAINT FK_companyTasks_companyCars  
  FOREIGN KEY (compid, carid)
  REFERENCES `companyCars` (compid, carid)

此方法允许数据库强制执行规定的要求/规范......

  

只有与公司相关的公司汽车表的汽车才允许在companyTasks表中使用。

我不确定这回答了你问的问题。

规范模式是外键引用主键。但MySQL允许外键引用不是主键的列(或列集)。

答案 1 :(得分:0)

我可能会查看companyCars Table,因为它确保没有“错误”的汽车发现它进入公司的任务。但是如果你不需要这种安全性,那么使用直接方式也可以。