2013-04-28 79 views
2

我正在使用MySql數據庫,其中有一個名爲books的表。相關條目 - 使記錄之間的雙向關聯

我想實現一個系統,用戶可以通過它關聯兩個項目,以便在查看一個項目時,它會顯示一個到另一個項目的鏈接。

我的問題是,我想的方式,當book1id==1)連接到book2id==2),也book2鏈接到book1,反之亦然這樣做。

我想這樣做的方式是創建一個名爲relations的新表,並且至少有兩個列col1col2,其中保存所有相關項目的ID。 例如,對於book1book2行應該是這樣的:

————————————————— 
| COL1 | COL2 | 
    ————————————————— 
1| 1 | 2 | 
    ————————————————— 

所以觀看book1的時候我會SELECT * FROM 'relations' WHERE COL1 = '1' OR COL2 = '1'

我想以這種方式它應該工作,但我想知道是否有一個更好/更有效的方式來處理這個問題。

回答

0

「或」 - 子句是索引用法的殺手。我會說,如果你的關係是對稱的,只需在表中添加兩對 - 如1-2和2-1。

它將所需空間加倍,但是 - 這就是SQL。 ;-)

編輯 爲了澄清 「殺死指數」:當你在col1的索引,請求

select col2 from correlation_table where col1 = 12 

是非常快的,而聲明

select col1, col2 from correlation_table where col1 = 12 or col2 = 12 

是緩慢的,只要你有很多關係,你需要col1上的索引和col2上的索引,並且你必須將查詢分解成

select col1, col2 from correlation_table where col1 = 12 
    union 
    select col1, col2 from correlation_table where col2 = 12 
+0

您指的是「索引用途的殺手」?如果我有第三列廣告索引(增量ID),會有什麼不同嗎?無論如何,我一直在想它...... – ghego1 2013-04-29 05:39:30

+0

MySQL-Query-Optimizer可以爲每個表使用一個索引。如果查詢「where col1 = 12 or col2 = 12」,它不能使用索引。 第三列不會改變這一點,但由於某些原因,唯一的ID是一個好主意。 當col1是數字時,我最好避免col1 ='1',col1 = 1應該會更好。 – flaschenpost 2013-04-29 13:22:40