2010-08-21 91 views
6

我有一個書籍和作者的數據集,有多對多的關係。Python中的多對多數據結構

約有10^6本書和10^5位作者,每本書平均有10位作者。

我需要對數據集執行一系列操作,例如統計每位作者的書數,或者刪除某個作者的所有書籍。

什麼是一個好的數據結構,將允許快速處理?

我希望對一些現成的模塊,它可以提供的線沿線的方法:

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 

我要澄清,我不喜歡使用這個數據庫,但要做到這一切在內存。

感謝

+2

把信息放在數據庫中? – obelix 2010-08-21 17:28:53

+1

將其放入內存而不是磁盤的數據庫中。 – carl 2010-08-21 17:32:12

回答

16

sqlite3(或任何其他良好的關係數據庫,但sqlite Python自帶,是這樣一個相當小的數據集更加便利),似乎對你的任務是正確的做法。如果你不想學習SQL,SQLAlchemy是關於關係數據庫的流行「包裝」,可以這麼說,它允許你在你選擇的幾種不同的抽象層次上處理它們。

和「做這一切的記憶」是完全沒有問題(這是,你要知道,因爲你不必要支付從什麼地方更持久的每一個的運行中的所有數據讀取開銷你的程序,同時將數據庫保存在磁盤文件中可以節省你的開銷 - 但這是一個不同的問題;-)。只需打開你的sqlite數據庫爲':memory:',你就是 - 一個全新的關係數據庫(僅在你的進程中),沒有涉及的所有的磁盤。那麼,爲什麼不呢?)

就我個人而言,我會直接使用SQL來執行此任務 - 它使我能夠很好地控制發生了什麼,並輕鬆地添加或刪除索引來調整性能等。 'd使用三個表:Books表(主鍵ID,其他字段,例如標題& c),Authors表(主鍵ID,其他字段,例如名稱& c)以及「多對多關係表「,例如BookAuthors,只有兩個字段,BookIDAuthorID,每個作者簿連接記錄一個。

BookAuthors表的兩個字段是所謂的「外鍵」,分別指書籍和作者的ID字段,您可以使用ON DELETE CASCADE來定義它們,以便引用獲取書籍或作者的記錄被刪除的內容會依次自動刪除 - 即使是「裸」的SQL也能讓您工作的高語義級別的示例,而其他現有數據結構無法與之匹配。

+2

我相信sqlite甚至可以選擇在內存中創建數據庫。 – Omnifarious 2010-08-21 17:35:23

+1

另外,根據OP的註釋使用內存:「你也可以提供特殊的名字':memory:'在RAM中創建一個數據庫。」 – 2010-08-21 17:35:36

+0

此外,sqlite只能在內存中使用 - 請參閱http://www.sqlite.org/inmemorydb.html – Brendan 2010-08-21 17:35:52

2

我希望對一些現成的模塊,它可以提供的線沿線的方法:

由於實際工作,你還需要什麼呢?

您有書籍和作者類定義。您還有一個關於書籍作者的關係。管理添加/更改/刪除所需的方法只有幾行代碼。

創建作者,書籍和作者書籍關聯對象的大老字典。

使用shelve將其全部存儲。

完成。