2012-09-14 91 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)?但是我不確定......對不起 –

相關問題