任何人都可以立即在下面的模式中看到問題或瓶頸嗎?閱讀是90%的操作,但我想知道如果我在寫作的任何地方在腳下射擊自己。帶有多列PRIMARY鍵的樞軸表設計MySQL
命題
每個對象(行中的另一個表)可以與其他對象。每個關係對只能有一個記錄(對是方向敏感的,所以X
到Y
可以與Y
到X
共存)。
+-------+---------------------+------+-----+---------+----------------+
| 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
的選擇 - 因爲它沒有離開索引,將它在所有使用嗎?如果不是,將增加一個單獨的索引會導致寫入的重大開銷?
表是什麼引擎?你可能想在單個事務中執行'DELETE/INSERT'。 –
@ The Scrum Meister - InnoDB – TheDeadMedic