2012-09-14 33 views
0

我有2个表。查询具有多个可能匹配值的字段的最快方法

第一个表格被称为professions,并且这些表格被ID索引。所以现在每个职业都有一个与之相关的独特ID。

我的第二个表叫做contacts,在那里我有一个profession字段,它现在只保存某个职业相关的ID。

我的问题是,如果我有一个联系人有多个专业相关联。

什么是查询表的最佳方法和存储联系人专业的方式。我不想做的是创建一个字段,为每个专业存储0或1个int。原因是因为我想动态增长专业表,并且在查询时让数字反映我网站上的任何动态更改。

回答

2

您有多对多的关系。要在MySQL中实现,你应该使用一个链接表。因此,professionscontacts应该在每个表中都有一个ID,但没有外键,并且您创建了一个名为profession_contact_links的新表,它包含其自己的ID,以及profession_idcontact_id,这两个表都是相应表的外键。那么你可以有许多与每个职业联系在一起的联系人​​,并且许多职业与每个联系人联系在一起。要在select中连接两个主表,您需要两个连接,它们将取决于您想要选择的内容。

+0

因此,当你删除一个联系人,它会级联professions_contact_link表中的删除? – Eli

+0

如果您使用的是InnoDB,那么您可以将它们设置为注册外键,在这种情况下,我明白删除将被级联到链接记录。一般来说,我倾向于不使用InnoDB的外键系统,只要确保在删除原始记录时删除链接(这只是一个额外的查询)。 – gandaliter

2

此建模问题的标准解决方案称为链接表。

基本上它是包含链接两个表的ID的表,所以你就必须一起列链接表和主键这两个列的是:

(profession_id, contact_id) 

或另一个顺序......并不重要,但顺序会影响性能,最常搜索的关键是您首先想要的。

然后,您使用SELECT ... IN (...)SELECT ... JOIN ...来查询您之后的数据。

1

取决于你想要什么,你要如何找到它,我建议rlikein

SELECT ... FROM <table> WHERE <column name> RLIKE "^id1|id2|id3$"

这会发现包含任何这三个条件中的任何细胞

或使用

SELECT ... FROM <table> Where <column name> IN ('id1','id2','id3')

这将发现任何等于的细胞到这三个之一。

+0

我的联系人表有10,000,000条记录。 RLIKE表现如何? – Eli

+0

我不知道......但我猜测会是RLIKE慢,LIKE慢,In快(er)?但是我不确定......对不起 –

相关问题