問題場景: 在任務調度系統中,每個任務 既有上游 ,也有下游。如何設計 底層存儲的表結構 支撐這種存儲。
解決方法:
一. 採用圖形 數據庫 neo4j,每個節點 代表一個任務,節點之間的 邊 (帶有方向箭頭) 表示 任務之間的依賴關係。
二. mysql等關係型數據庫。
設計1 : 將 上下游依賴關係 作爲 任務的屬性 存儲起來。 即: 任務id(主鍵)、任務名稱、任務的上游id list、任務的下游id list。
優點: 這是最容易想到的方案。 但知覺告訴我不是很佳的方案,而且也顯然不滿足 3NF的設計原理。
缺點:
設計2: 只存儲任務的上游依賴。 即 任務id(主鍵)、任務名稱、任務的上游id list。
設計3: 將 任務之間的 依賴關係 單獨 作爲一個記錄表 保存。依賴關係記錄表的 表結構:自增主鍵id、上游任務id、下游任務id。同時 將 第二列、第三列都增加索引。
推薦設 計3.
優點: 因爲依賴關係是 相對的,如果A和B有依賴關係,顯然上游任務id就是A,下游任務id就是B。作爲一條記錄 insert 記錄表。
如何查詢 A的所有下游,則 select 下游任務id from 表 where 上游任務id=‘A’。 如果記錄條數爲0,則說明A無下游。
如何查詢A的所有上游, 則 select 上游任務id from 表 where 下游任務id=‘A’。
而且不存在冗餘。 對於任何一個依賴關係,只有一條記錄。