2013-09-03 70 views
18

Tôi đã xem xét việc tạo bảng Vertices và bảng Edges nhưng sẽ xây dựng biểu đồ trong bộ nhớ và duyệt qua biểu đồ phụ yêu cầu số lượng lớn tra cứu? Tôi muốn tránh đọc cơ sở dữ liệu quá mức. Có cách nào khác để duy trì một biểu đồ?Làm thế nào để duy trì cấu trúc dữ liệu biểu đồ trong cơ sở dữ liệu quan hệ?

Lưu ý phụ: Tôi đã nghe nói về Neo4j nhưng câu hỏi của tôi thực sự là cách biểu diễn khái niệm biểu đồ trong cơ sở dữ liệu chuẩn. Tôi đang mở cho một số giải pháp NoSQL như mongodb mặc dù.

+0

Để cung cấp cho bạn lời khuyên hữu ích, tôi sẽ cần thêm thông tin từ phía bạn. Có bao nhiêu nút và bao nhiêu mối quan hệ chúng ta đang nói đến? –

+0

Tôi muốn nói hàng tỷ nút. Giống như tôi đã nói điều này chủ yếu là khái niệm nhưng tôi tò mò làm thế nào để quy mô cho rất nhiều hồ sơ. Tôi đoán có rất nhiều đồ thị. –

+1

Không phải mã nguồn mở mà chính xác là những gì bạn đang tìm kiếm: Aster 6.0 mới đi kèm với công cụ đồ thị trong cơ sở dữ liệu quan hệ - được gọi là SQL-GR và nhằm mục đích sử dụng các hàm hiện có và mới trên các biểu đồ được lưu trữ trong các bảng quan hệ (trong Aster): được biểu diễn với bảng nút và bảng cạnh. – topchef

Trả lời

20

Câu trả lời là không may: Việc xem xét của bạn hoàn toàn đúng ở mọi thời điểm. Bạn phải lưu trữ các nút (đỉnh) trong một bảng và các cạnh tham chiếu một mã từ và một nút để chuyển đổi cấu trúc dữ liệu biểu đồ thành cấu trúc dữ liệu quan hệ. Và bạn cũng đúng, điều này kết thúc trong một số lượng lớn tra cứu, bởi vì bạn không thể phân vùng nó thành đồ thị con, có thể được truy vấn cùng một lúc. Bạn phải chuyển từ Node sang Edge sang Node sang Edge sang Node ... và cứ tiếp tục (Recursively, trong khi SQL đang làm việc với Sets).

Vấn đề là ...

Relational, Graph định hướng, định hướng đối tượng, tài liệu dựa trên các loại khác nhau của các cấu trúc dữ liệu mà đáp ứng các yêu cầu khác nhau. Đó là tất cả những gì về nó và tại sao có rất nhiều cơ sở dữ liệu NoSQL khác nhau (hầu hết trong số đó là các kho tài liệu đơn giản) xuất hiện, bởi vì nó đơn giản là không tổ chức dữ liệu lớn một cách quan hệ.

Alternative 1 - Graph cơ sở dữ liệu theo định hướng

Nhưng cũng có cơ sở dữ liệu NoSQL hướng đồ thị, mà làm cho các mô hình dữ liệu đồ thị là một công dân hạng nhất như OrientDB mà tôi đang chơi xung quanh với một chút vào lúc này. Điều tốt đẹp về nó là, mặc dù nó vẫn tồn tại dữ liệu dưới dạng đồ thị, nó vẫn có thể được sử dụng trong một cách định hướng quan hệ hoặc hướng đối tượng hoặc tài liệu cũng (tức là bằng cách truy vấn với SQL cũ đơn giản). Tuy nhiên, Traversing the graph là cách tối ưu để lấy dữ liệu của nó.

Phương án 2 - làm việc với đồ thị trong bộ nhớ

Khi nói đến việc định tuyến nhanh, khuôn khổ định tuyến như Graphhopper xây dựng hoàn chỉnh các đồ thị (tỷ Nodes) bên trong bộ nhớ. Bởi vì Graphhopper sử dụng một MemoryMapped thực hiện của GraphStore của nó, mà thậm chí làm việc trên các thiết bị Android chỉ với một số MB bộ nhớ cần. Biểu đồ hoàn chỉnh được đọc từ cơ sở dữ liệu vào bộ nhớ khi khởi động, và định tuyến được thực hiện ở đó, vì vậy bạn không cần tra cứu cơ sở dữ liệu.

+6

+1 BTW: sự khác biệt thực sự duy nhất giữa 'DB đồ thị' và 'DB quan hệ' là ** triển khai ** của tra cứu. Nếu danh sách cạnh được tham chiếu trong bảng nút đạt được thông qua một con trỏ trực tiếp người ta có thể gọi nó là đồ thị DB mặc dù dữ liệu vẫn có thể được tổ chức trong bảng! Vì vậy, nếu tra cứu này là log (n) cho mỗi danh sách cạnh hoặc thậm chí mỗi cạnh thì mọi người gọi nó là 'DB quan hệ' và duyệt qua biểu đồ khá đắt (độc lập với thực tế nếu bộ nhớ được định vị hoặc trong bộ nhớ hoặc khác) . – Karussell

+1

@Karussell cần lưu ý rằng hầu hết các cơ sở dữ liệu SQL đều hỗ trợ các chỉ mục dựa trên băm, với việc tìm kiếm cạnh/đỉnh là O (1), giống như đối với một cơ sở dữ liệu đồ thị. Thời gian truy vấn O (log (n)) thường được kết hợp với các chỉ mục dựa trên B-tree, phần lớn được sử dụng khi phân loại dữ liệu là quan trọng (đối với các ID cạnh/đỉnh thường không liên quan). – ThePhysicist

+1

Có thể bạn đã đúng. Vẫn là một chỉ số dựa trên băm có chi phí (không gian và thời gian) trong thực tế IMO so với một con trỏ trực tiếp. Nhưng có lẽ công nghệ được sử dụng rất giống với cả DB và chỉ là blabla tiếp thị làm cho chúng xuất hiện rất khác :) – Karussell

3

tôi phải đối mặt với vấn đề này cùng và quyết định cuối cùng đi với cấu trúc sau đây, đòi hỏi 2 câu truy vấn cơ sở dữ liệu, sau đó phần còn lại của công việc là trong bộ nhớ:

cửa hàng nút trong một bảng và tham khảo các đồ thị với nhau kỷ lục nút:

Table Nodes 

id | title | graph_id 
--------------------- 
105 | node1 | 2 
106 | node2 | 2 

Cũng lưu trữ cạnh trong bảng khác và một lần nữa tham khảo đồ thị các cạnh thuộc với mỗi cạnh:

Table Edges 

id | from_node_id | to_node_id | graph_id 
----------------------------------------- 
1 | 105   | 106  | 2 
2 | 106   | 105  | 2 

. Nhận tất cả các nút với một truy vấn, sau đó nhận được tất cả các cạnh với nhau.

Bây giờ, hãy tạo cách ưa thích của bạn để lưu trữ biểu đồ (ví dụ: danh sách kề) và tiếp tục với luồng ứng dụng của bạn.