2010-01-17 35 views
21

Tôi đang nghĩ về việc sử dụng/triển khai một số loại khóa-giá trị (hoặc tài liệu) được nhúng cho ứng dụng Windows trên máy tính để bàn của tôi. Tôi muốn có thể lưu trữ các loại dữ liệu khác nhau (theo dõi GPS sẽ là một ví dụ) và tất nhiên có thể truy vấn dữ liệu này. Số lượng dữ liệu sẽ được như vậy mà nó không thể tất cả được nạp vào bộ nhớ cùng một lúc.Lưu trữ dữ liệu không quan hệ (nosql) nhúng

Tôi đang suy nghĩ về việc sử dụng sqlite làm công cụ lưu trữ cho kho khóa-giá trị, chẳng hạn như y-serial, nhưng được viết bằng .NET. Tôi cũng đã đọc về FriendFeed's usage of MySQL to store schema-less data, là một con trỏ tốt về cách sử dụng RDBMS cho dữ liệu phi quan hệ. sqlite có vẻ là một lựa chọn tốt vì tính đơn giản, tính di động và kích thước thư viện của nó.

Câu hỏi của tôi là liệu có bất kỳ tùy chọn nào khác cho một cửa hàng không liên quan được nhúng không? Nó không cần phải được phân phối và nó không phải hỗ trợ các giao dịch, nhưng nó có thể truy cập được từ .NET và nó phải có kích thước tải xuống nhỏ.

CẬP NHẬT: Tôi đã tìm thấy một bài viết có tiêu đề SQLite as a Key-Value Database so sánh sqlite với Berkeley DB, một thư viện lưu trữ khóa-giá trị được nhúng.

Trả lời

5

Cá nhân tôi sẽ đi cho SQLite với NHibernate (và Fluent NHibernate). NHibernate có thể tạo lược đồ cơ sở dữ liệu tự động cho các lớp của bạn, vì vậy bạn chỉ cần xác định những lớp nào bạn muốn tồn tại, và điều đó khá dễ dàng với Fluent NHibernate. Hơn nữa, bạn có thể tìm kiếm các đối tượng cụ thể và bạn không cần tải tất cả dữ liệu vào bộ nhớ.

+0

Nhưng anh ấy muốn có một cửa hàng không có lược đồ .... –

+0

Astor là đúng: Tôi muốn tránh mô hình quan hệ. Tôi muốn có thể lưu trữ thực tế bất kỳ loại dữ liệu nào mà không cần phải chuẩn bị lược đồ cơ sở dữ liệu cho nó. Ngoài ra, có một mô hình quan hệ chặt chẽ có thể có vấn đề nếu cấu trúc dữ liệu thay đổi sau này - tôi sẽ cần viết các kịch bản lệnh SQL thay đổi cho dữ liệu hiện có trong cửa hàng. –

+1

Tôi biết những gì ông đang tìm kiếm nhưng các công cụ như NHibernate với thế hệ lược đồ ẩn các khía cạnh quan hệ gần như hoàn toàn. Bạn không cần phải định nghĩa bất kỳ lược đồ nào nhưng chỉ lập bản đồ cho bạn các lớp (thực sự là thẳng về phía trước với Fluent NHibernate) và khi các lớp của bạn thay đổi, bạn sẽ cần thực hiện một số cập nhật trong bất kỳ chiến lược kiên trì nào. –

19

Windows có cửa hàng không liên quan được tích hợp sẵn. Nó được gọi là ESENT và được sử dụng bởi một số ứng dụng Windows, bao gồm Active Directory và Windows Desktop Search.

http://blogs.msdn.com/windowssdk/archive/2008/10/23/esent-extensible-storage-engine-api-in-the-windows-sdk.aspx

Nếu bạn muốn truy cập NET bạn có thể sử dụng các lớp ManagedEsent trên CodePlex.

http://managedesent.codeplex.com/

dự án đó có một lớp PersistentDictionary mà thực hiện một cửa hàng quan trọng có giá trị mà thực hiện giao diện IDictionary, nhưng được hỗ trợ bởi một cơ sở dữ liệu.

+0

@Laurion, tôi đã nhìn thấy ESENT và ban đầu rất vui mừng. Vấn đề duy nhất là nó chỉ có Windows (nghĩ về Mono + Linux/Mac). –

2

Áp dụng nguyên tắc KISS cho vấn đề của bạn Tôi khuyên bạn nên sử dụng tệp.

Như trong tên tệp là khóa. Nội dung tệp là giá trị. Thư mục Windows là chỉ mục.

Đơn giản, nhanh chóng, hiệu quả, linh hoạt và dễ sử dụng (cung cấp kẻ ngu có trí thông minh thấp).

+0

Cách tiếp cận tốt đẹp, mặc dù tôi cảm thấy việc sử dụng các tệp để lưu trữ các giá trị sẽ là một bit over-the-top cho các giá trị đơn giản (ví dụ như một số nguyên). –

+0

Loại câu hỏi ngụ ý rằng những gì đang được lưu trữ có thể được yên tĩnh lớn (tài liệu/quá nhiều dữ liệu được nạp vào bộ nhớ). Một trong những ưu điểm của phương pháp tập tin là bạn có được một bộ các lớp xử lý luồng miễn phí, rất hữu ích khi xử lý các khối dữ liệu lớn và sạch hơn nhiều so với việc chia nhỏ dữ liệu thành các đốm màu NMB và lưu trữ nó trong một cơ sở dữ liệu. –

+2

Đúng. Điều gì về giới hạn vật lý của hệ thống tập tin? Làm thế nào để lưu trữ như vậy hành xử khi số lượng hồ sơ đạt> 100.000? Ngoài ra: khi tôi nói về "quá nhiều dữ liệu", tôi có nghĩa là cơ sở dữ liệu _whole_ - tôi đã đề cập điều này để tránh các câu trả lời như tuần tự hóa đối tượng và tương tự. –

1

Cám ơn đề cập đến loại lại y_serial ... chính xác hơn, nó là một mô-đun Python:

đối tượng Python kho với SQLite

"serialization + kiên trì :: trong một vài dòng mã, nén và chú thích các đối tượng Python vào trong SQLite, sau đó truy xuất chúng theo thứ tự thời gian bằng các từ khóa không có bất kỳ SQL nào. Mô-đun "tiêu chuẩn" hữu ích nhất cho cơ sở dữ liệu để lưu trữ dữ liệu lược đồ ít hơn."

http://yserial.sourceforge.net

Theo kinh nghiệm của tôi, SQLite là một sự lựa chọn nhanh hơn và đáng tin cậy hơn so với hầu hết các cơ sở dữ liệu (bao gồm PostgreSQL và Berkeley DB) cho phần lớn các dự án - và dĩ nhiên, nó không cần một daemon máy chủ .

yserial là rất dễ dàng để thực hiện (và xa nhanh hơn so với "filename là nội dung then chốt/tập tin là giá trị" cách tiếp cận ;-)

+0

Vâng, tôi thực sự thích cách tiếp cận y-serial, đặc biệt là vì nó sử dụng sqlite. Hãy tiếp tục phát huy! Có lẽ khi tôi nhận được một số thời gian từ các dự án khác của tôi, tôi sẽ cố gắng làm điều tương tự trong C# :) –

2

bạn có thể tạo ra một cơ sở dữ liệu SQLite đơn giản với hai cột:

==documents== 
id|data 

và dữ liệu sẽ là dữ liệu json.

Bạn cũng có thể tạo ra một bảng chìa khóa đó sẽ là:

==keys== 
keyname|keyvalue|id 

đó sẽ được lập chỉ mục trên KeyName và KeyValue để tra cứu nhanh chóng.

Một tệp db duy nhất có thể là một bộ sưu tập và bạn có thể tạo nhiều tệp db cho nhiều bộ sưu tập.

Bạn có thể sử dụng các thư mục như "dbs" để phù hợp với hệ thống phân cấp MongoDB của db-> collection-> tài liệu

+0

Chỉ cần lưu ý: bạn sẽ tạo một tệp mẫu sqlite db và sao chép nó bất kỳ lúc nào bạn cần tạo bộ sưu tập mới . Nếu ai đó muốn tạo một thiết lập php để xử lý và mở nguồn này, hãy cho tôi biết. Tôi nghĩ rằng nó sẽ là tuyệt vời, nhưng không bao giờ làm phiền để làm cho nó bản thân mình. – RobKohr

+0

đề xuất của bạn là theo hướng y-serial làm việc như thế nào. Bạn đã thấy nó chưa? http://yserial.sourceforge.net/ –

+0

Không, nhưng tôi đang tìm một giải pháp php bản thân mình. – RobKohr

10

Hãy xem RavenDB. Có vẻ như nó có thể được nhúng và là schemaless và làm việc với .NET

Từ trang web:

  • cơ sở hạ tầng Scalable: Raven được xây dựng trên đỉnh hiện có, đã được kiểm chứng và cơ sở hạ tầng mở rộng
  • đơn giản cấu hình Windows : Raven rất đơn giản để thiết lập và chạy trên các cửa sổ dưới dạng dịch vụ hoặc trang web IIS7
  • Giao dịch: Hệ thống hỗ trợ Raven.Việc giao dịch với các giao dịch ACID. Nếu bạn đặt dữ liệu vào đó, dữ liệu đó sẽ ở đó
  • Bản đồ/Giảm: Dễ dàng xác định chỉ mục bản đồ/giảm với các truy vấn LINQ
  • .NET Client API: Raven đi kèm với API ứng dụng .NET đầy đủ chức năng thực hiện đơn vị làm việc và nhiều hơn nữa
  • RESTful: Raven được xây dựng xung quanh một API RESTful
2

Đây là một câu hỏi cũ, nhưng tôi nghĩ rằng tôi muốn thêm một câu trả lời trong trường hợp bất cứ ai tình cờ trên đó. Công ty của tôi vừa phát hành một cơ sở dữ liệu XML nhúng nguồn mở cho nền tảng .NET có tên là Nxdb. Đó là theo giấy phép Apache 2.0 và đã được phát triển và sử dụng nội bộ trong nhiều năm. Về cơ bản nó là một ràng buộc đối với một phiên bản được biên dịch chéo (sử dụng IKVM) của BaseX (một cơ sở dữ liệu XML Java tuyệt vời) cùng với các chức năng bổ sung cho trường hợp sử dụng nhúng và môi trường .NET. Trang dự án ở đây: https://dracorp.assembla.com/spaces/nxdb

XML hoạt động tốt cho loại lưu trữ dữ liệu này miễn là nội dung bạn đang cố gắng lưu trữ có thể tuần tự hóa thành văn bản bạn có thể lưu trữ cây phân cấp phức tạp. Trong thực tế, nếu bạn truy cập trực tiếp vào cơ sở dữ liệu, bạn thậm chí không bao giờ phải chạm vào "XML". Nó cũng có thể được truy vấn bằng XQuery, một ngôn ngữ truy vấn đầy đủ và mạnh mẽ.

1

Bạn có thể thử cái này https://github.com/mdsoftware/mData. Nhỏ, miễn phí và khá bất thường.Ngôn ngữ truy vấn dữ liệu giống như Lisp, trình biên dịch biểu thức, tuần tự hóa nhị phân hiệu suất cao, tất cả được bao gồm.

Các vấn đề liên quan