10

我開始了一個具有一些分層數據的新項目,並且我正在查看將數據存儲在數據庫中的所有選項。數據庫中的分層數據:遞歸查詢與封閉表與圖數據庫的比較

我使用PostgreSQL,它允許遞歸查詢。我還研究了關係數據庫的設計模式,例如closure tables,我看了一下圖形數據庫解決方案,比如neo4j。

我發現很難決定這些選項。例如:鑑於我的RDBMS允許遞歸查詢,使用閉包表還是有意義的,並且在可維護性和性能方面如何與圖數據庫解決方案進行比較?

任何意見/經驗將不勝感激!

+1

這個封閉表的東西實際上是非常整齊。如果你有遞歸查詢,但不必要,但仍然非常整齊。感謝您的關注。 –

回答

8

全封閉表是多餘的,如果你可以使用遞歸查詢:)

我認爲這是更好的有,你必須比處理額外的IO(和磁盤空間,一旦找出一個複雜的遞歸查詢)的一個單獨的表和相關的觸發器。

我已經在postgres中用遞歸查詢做了一些簡單的測試。在表中有幾百萬行的查詢仍然是< 10ms,用於返回特定孩子的所有父母。返回所有的孩子也很快,這取決於父母的水平。它似乎更依賴磁盤IO獲取行而不是查詢速度本身。這是單用戶完成的,所以不知道它如何在負載下執行。如果你還可以將大部分表格保存在內存中(並正確設置postgres),我懷疑它會非常快。通過父母身份對錶進行聚類似乎也有所幫助。

+0

謝謝,我想這可能是如此 – tospo

+1

感謝您的基準。 –

+0

普遍認同,儘管請參閱Bill Karwin的SQL反模式以獲取關於何時您可能仍想使用替代鄰接列表方法(其中parent_id是字段)的指南 – Joffer

2

閉合表的級別字段(「深度」)是多餘的。它只需要一個遞歸查詢來計算它。總結一下。