2010-08-21 39 views
6

Tôi có tập hợp sách và tác giả dữ liệu, với mối quan hệ nhiều-nhiều.Cấu trúc dữ liệu nhiều thành phần trong Python

Có khoảng 10^6 sách và 10^5 tác giả, với trung bình 10 tác giả mỗi sách.

Tôi cần thực hiện một loạt các thao tác trên tập dữ liệu, chẳng hạn như đếm số lượng sách của từng tác giả hoặc xóa tất cả sách của một tác giả nhất định khỏi tập hợp.

Cấu trúc dữ liệu tốt sẽ cho phép xử lý nhanh là gì?

Tôi hy vọng đối với một số sẵn sàng thực hiện mô-đun có thể cung cấp phương pháp dọc theo dòng:

obj.books.add(book1) 

# linking 
obj.books[n].author = author1 
obj.authors[m].author = book1 

# deleting 
obj.remove(author1) # should automatically remove all links to the books by author1, but not the linked books 

Tôi nên làm rõ rằng tôi không thích sử dụng một cơ sở dữ liệu cho việc này, nhưng để làm tất cả trong bộ nhớ .

Cảm ơn

+2

đặt thông tin trong cơ sở dữ liệu? – obelix

+1

Đặt trong cơ sở dữ liệu nằm trong bộ nhớ thay vì đĩa. – carl

Trả lời

16

sqlite3 (hoặc bất kỳ khác tốt quan hệ DB, nhưng sqlite đi kèm với Python và là handier cho một tập hợp lý nhỏ như vậy dữ liệu) dường như là cách tiếp cận phù hợp với nhiệm vụ của bạn. Nếu bạn không muốn tìm hiểu SQL, SQLAlchemy là một "trình bao bọc" phổ biến trên các DB quan hệ, do đó, để nói, cho phép bạn xử lý chúng ở bất kỳ mức trừu tượng nào khác nhau mà bạn chọn.

Và "làm tất cả trong bộ nhớ" không có vấn đề gì cả (đó là ngớ ngẩn, vì bạn sẽ không cần phải trả chi phí đọc trong tất cả dữ liệu từ một nơi nào đó liên tục hơn trên mỗi lần chạy chương trình của bạn, trong khi vẫn giữ DB trên một tệp đĩa sẽ giúp bạn tiết kiệm chi phí đó - nhưng, đó là một vấn đề khác ;-). Chỉ cần mở cơ sở dữ liệu sqlite của bạn là ':memory:' và ở đó bạn - một DB mới, quan hệ sống hoàn toàn trong bộ nhớ (chỉ trong suốt thời gian của quy trình của bạn), không có đĩa tham gia vào thủ tục tại tất cả. Vì vậy, tại sao không? -)

Cá nhân, tôi sử dụng SQL trực tiếp cho tác vụ này - nó cho phép tôi kiểm soát chính xác những gì đang diễn ra và dễ dàng cho phép tôi thêm hoặc xóa chỉ mục để hiệu chỉnh, v.v. 'd sử dụng ba bảng: một bảng Books (ID khóa chính, các trường khác như Tiêu đề & c), một bảng Authors (ID khóa chính, các trường khác chẳng hạn như Tên & c) và "bảng quan hệ nhiều-nhiều ", giả sử BookAuthors, chỉ với hai trường, BookIDAuthorID và một bản ghi cho mỗi kết nối tác giả-sách.

Hai trường của bảng BookAuthors là những gì được gọi là "khóa ngoại", tương ứng với trường ID của Sách và tác giả và bạn có thể xác định chúng bằng ON DELETE CASCADE để hồ sơ đề cập đến sách hoặc tác giả bị xóa sẽ tự động bị mất lần lượt - một ví dụ về mức ngữ nghĩa cao mà ngay cả SQL "trần" cho phép bạn làm việc, mà không có cấu trúc dữ liệu hiện có nào khác có thể gần khớp.

+2

Tôi tin rằng sqlite thậm chí còn có một tùy chọn để tạo cơ sở dữ liệu trong bộ nhớ. – Omnifarious

+1

Ngoài ra, để sử dụng bộ nhớ theo nhận xét trên OP: "Bạn cũng có thể cung cấp tên đặc biệt': memory: 'để tạo cơ sở dữ liệu trong RAM". –

+0

Hơn nữa, sqlite chỉ có thể được sử dụng trong bộ nhớ - xem http://www.sqlite.org/inmemorydb.html – Brendan

2

Tôi hy vọng đối với một số sẵn sàng thực hiện mô-đun có thể cung cấp phương pháp dọc theo dòng:

Kể từ đó thực sự hoạt động, nhiều hơn những gì bạn cần?

Bạn có định dạng Sách và lớp Tác giả. Bạn cũng có một Hiệp hội Sách-Tác giả cho các mối quan hệ. Các phương thức cần thiết để quản lý thêm/thay đổi/xóa chỉ là một vài dòng mã.

Tạo các từ điển cũ lớn của Tác giả, Sách và các đối tượng liên kết Sách-Tác giả.

Sử dụng shelve để lưu trữ tất cả.

Xong.

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