2016-01-02 25 views
0

您会看到我的问题非常简单,但我不知道索引条目的更好方法是什么。用一种非常简单的方式,我有四张桌子'汽车','公司','公司汽车'和'公司任务'。我应该在任务表中使用哪个主要ID

'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 
... 

什么是更好的方式来获得我的汽车的关系。在companyTasks Table中,更好地浏览companyCars Table(以及compcarid等),还是更好地在公司任务表中使用(以直接方式)carid。

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

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

seehma

+0

据推测,汽车一次只能属于一家公司,为什么不仅仅有一张桌子(汽车),而是一张空栏,用于识别给定汽车属于哪家公司(如果有的话)。 – Strawberry

回答

0

我可能会走在companyCars表,因为它确保没有“错”车找到它的方式进入companyTasks。但是,如果你不需要这种安全性,使用直接的方式也很好。

1

一种选择我想探讨一下:

如果companyCars表是一个“关系”的实施,而不是一个“实体”,我会考虑该表的主键的组合键...... (compid, carid)

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

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

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

这种方法允许数据库执行规定要求/规格...

只有汽车这与相关的公司companyCars表,允许被使用在companyTasks表中。


我不知道这个回答你问的问题。

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