GJ.*_*GJ. 8 python many-to-many data-structures
我有一组书籍和作者的数据集,具有多对多的关系.
大约有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
Run Code Online (Sandbox Code Playgroud)
我应该澄清一点,我不想为此使用数据库,而是在内存中完成所有操作.
谢谢
Ale*_*lli 17
sqlite3(或任何其他良好的关系数据库,但sqlite附带Python,并且对于这样一个相当小的数据集更方便)似乎是适合您的任务的正确方法.如果您不想学习SQL,SQLAlchemy是关系数据库的流行"包装器",可以说,它允许您在您选择的几个不同抽象级别中的任何一个处理它们.
并且"在内存中完成所有操作"根本不是问题(这是愚蠢的,请注意,因为你将不必要地支付从你的程序的每次运行中更持久的所有数据中读取的开销,同时保持磁盘文件上的数据库可以节省开销 - 但是,这是一个不同的问题;-).只需打开您的sqlite数据库':memory:'就可以了 - 一个全新的关系数据库完全存在于内存中(仅在您的进程持续时间内),根本不涉及该过程中的磁盘.那么,为什么不呢? - )
就个人而言,我直接使用SQL来完成这项任务 - 它让我能够很好地控制正在发生的事情,并且可以轻松地添加或删除索引以调整性能等.你将使用三个表:一个Books表(主键) ID,其他字段,例如Title&c),一个Authors表(主键ID,其他字段,如Name&c)和一个"多对多关系表",比如说BookAuthors只有两个字段,BookID并且AuthorID每个字段有一个记录作者 - 书籍连接.
BookAuthors表中的两个字段是所谓的"外键",分别指代书籍和作者的ID字段,您可以使用它来定义它们,ON DELETE CASCADE以便引用被删除的书籍或作者的记录依次自动删除 - 高语义级别的一个例子,即使是"裸"SQL也可以让你工作,没有其他现有的数据结构可以接近匹配.