2011-06-29 40 views
1

任何人都可以立即在下面的模式中看到問題或瓶頸嗎?閱讀是90%的操作,但我想知道如果我在寫作的任何地方在腳下射擊自己。帶有多列PRIMARY鍵的樞軸表設計MySQL

命題

每個對象(行中的另一個表)可以與其他對象。每個關係對只能有一個記錄(對是方向敏感的,所以XY可以YX共存)。

+-------+---------------------+------+-----+---------+----------------+ 
| Field | Type    | Null | Key | Default | Extra   | 
+-------+---------------------+------+-----+---------+----------------+ 
| a_id | bigint(20) unsigned | NO | PRI | NULL |    | 
| b_id | bigint(20) unsigned | NO | PRI | NULL |    | 
+-------+---------------------+------+-----+---------+----------------+ 

典型的請求將是獲得所有相關對象(對於給定對象A):

SELECT * FROM objects INNER JOIN relations ON id = b_id WHERE a_id = A 

關係是使用在界面中一個簡單的複選框陣列管理。爲了保存關係,我會計算當前集合中選中/未選中的區別(對象將在UI中分頁),然後相應地插入/刪除;

DELETE FROM relations WHERE a_id = A AND b_id IN(B,C) 

# if these relations already exist, will fail silently 
INSERT IGNORE INTO relations (a_id, b_id) VALUES (A,D), (A,E) 

可能還需要查詢反向關係,只使用b_id的選擇 - 因爲它沒有離開索引,將它在所有使用嗎?如果不是,將增加一個單獨的索引會導致寫入的重大開銷?

+0

表是什麼引擎?你可能想在單個事務中執行'DELETE/INSERT'。 –

+0

@ The Scrum Meister - InnoDB – TheDeadMedic

回答

1

b_id上添加第二個索引的好處將超過任何寫入開銷,因爲沒有索引,它將需要執行全表掃描,以便通過b_id進行過濾。

至於使上只是b_idb_id, a_id索引取決於表發動機,由於InnoDB存儲在二級索引中的主鍵,然而MyISAM沒有。

+0

請原諒我的無知,但對於InnoDB,'b_id'就足夠了嗎? – TheDeadMedic

+0

@thedeadmedic是的。 –

+0

說我不得不使用MyISAM(系統分佈式和InnoDB不保證) - 會添加'b_id,a_id'索引妨礙InnoDB?即損害或者/或者? – TheDeadMedic