簡體   English   中英

以最佳方式存儲分層數據:NoSQL 或 SQL

[英]Store Hierarchical data in a best way: NoSQL or SQL

我正在處理分層數據,就像在樹結構中一樣。 我想知道將它們存儲在數據庫中的最佳方法是什么。

我從 MySQL 中的鄰接表開始。 但隨着數據的增加,性能似乎有所下降。 我在具有父子關系的 MySQL 表中存儲了大約 20,000 行,並且將來會增加。 獲取數據需要很長時間,因為我必須根據樹的深度編寫許多自連接。

所以我一直在尋找存儲這種數據的最佳方式。 有一次我發現嵌套集比鄰接列表更好。 然后我被建議看看 NoSQL,如果這能解決我的問題。 所以我現在很困惑是留在 SQL 中還是進入 No SQL,或者是否有任何其他最好的方法來處理這種數據。

那么任何人都可以建議我什么是最好的方法?

如果 MySQL 給您帶來的麻煩比它解決的麻煩多,我會看看 MongoDB、CouchDB 或 ElasticSearch(取決於您的用例)。 甚至可能是 Neo4j。 你的選擇應該歸結為幾個點,比如復制、擴容、一致性……我建議你在決定之前仔細閱讀一些官方文檔。 這是比較的起點

使用 NoSQL 將擺脫所有連接並提高性能,但您仍然需要使用鄰接列表、嵌套集、物化路徑等來實現適當的層次結構……

請記住,上面的 NoSQL 技術幾乎都使用最終一致性,這實質上意味着您的數據在給定時間在某些節點之間可能不一致。 如果這是一個問題,您應該堅持使用 RDBMS。

Postgres 對它有本地支持,使用ltree

-- Ltree type presentation
-- Farshid Ashorui

-- First of all, this is an extension (included with standard installation)
CREATE EXTENSION IF NOT EXISTS ltree;

-- We need to specify `ltree` type.
CREATE TABLE IF NOT EXISTS tree(
    id serial primary key,
    letter char,
    path ltree
);


-- we are using `gist` index for super fast indexing of the path.
-- read more here: http://patshaughnessy.net/2017/12/15/looking-inside-postgres-at-a-gist-index
-- This is Postgres’s GiST index API to find and match descendant nodes
CREATE INDEX IF NOT EXISTS tree_path_idx ON tree USING GIST (path);


-- @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

-- Root of heirarchy
insert into tree (letter, path) values ('A', 'A');
insert into tree (letter, path) values ('B', 'A.B');
-- Notice here, we are deviating 
insert into tree (letter, path) values ('C', 'A.C');
insert into tree (letter, path) values ('D', 'A.C.D');
insert into tree (letter, path) values ('E', 'A.C.E');
insert into tree (letter, path) values ('F', 'A.C.F');
-- Back to B path
insert into tree (letter, path) values ('G', 'A.B.G');





-- @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-- Search for A.C path
select * from tree where path <@ 'A.C';
-- More advanced one:
select * from tree where strpos(path::varchar, 'A.B.G') = 1;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM