2010-08-21 45 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将其全部存储。

完成。