SQL中集合的Python字典

标签 python sql database dictionary sqlite

我有一个 Python 字典,其中键是整数,值是整数集。考虑到潜在的大小(数百万个键值对,其中一个集合可以包含 1 到几百个整数),我想将它存储在 SQL (?) 数据库中,而不是用 pickle 序列化它来存储它和在我需要的时候把它装回去。

通过四处阅读,我看到了两种可能的方法,它们都有缺点:

  • 序列化集合并将它们存储为 BLOB:所以我会得到一个包含两列的 SQL,第一列是作为 INTEGER PRIMARY KEY 的字典的键,第二列是BLOBS,包含一组整数。 缺点:如果不加载完整的 BLOB 就无法再更改集合,并且在向其添加值后,将其序列化并作为 BLOB 插入回数据库。

  • 为每个集合的每个元素添加一个唯一的键:我会得到两列,一列有键(现在是 key_dictionary + 集合/列表的索引元素),一列有每行一个整数值。我现在可以将值添加到“集合”,而不必将整个集合加载到 python 中。我将不得不做更多的工作来跟踪所有的 key 。

此外,一旦数据库完成,我将始终需要集合作为一个整体,所以想法 1 似乎更快?如果我在某些值之间查询主键中的所有内容,或者像某些值一样,以获取我在系统 2 中的整个集合,SQL 数据库 (sqlite) 是否仍将作为哈希表工作?或者它会线性搜索适合我的 BETWEEN 或 LIKE 搜索的所有值吗?

总的来说,解决这个问题的最佳方法是什么?显然,如果有完全不同的第三种方法可以自然地解决我的问题,请随时提出建议! (通过搜索还没有找到任何其他解决方案)

我是 Python 的新手,尤其是数据库,所以如果我的问题不清楚,请告诉我。 :)

最佳答案

你的第二个答案几乎是我推荐的。我要做的是拥有三列:

  • 集合编号
  • key
  • 值(value)

然后我会在 Set ID 和 Key 上创建一个复合主键,以保证组合是唯一的:

CREATE TABLE something (
  set, 
  key, 
  value, 
  PRIMARY KEY (set, key)
);

您现在可以将值直接添加到特定集合中(或更新集合中的键)并选择集合中的所有键。

话虽这么说,您的第一个策略对于读取密集型工作负载会更优化,因为索引的大小会更小。

will the SQL database (sqlite) still work as a hashtable?

SQL 数据库倾向于使用哈希表。他们通常也不进行顺序查找。他们所做的通常是创建一个索引(它往往是某种树,例如 B 树),它允许范围查找(例如,您不确切知道要查找的键)。

关于SQL中集合的Python字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37852393/

相关文章:

python - 如何连接多个文本或 xml 文件但省略每个文件中的特定行?

SQL帮助: Find which columns caused the mismatch

mysql - 如何将非常大的sql文件导入mysql?

Python混合全局变量和局部变量?

python - 使用 ODO python 包将 CSV 加载到 MySQL 表中 - 日期错误 1292

python - 仅锁定 Python 中的一部分威胁

sql - Oracle 数据库 View /系统表检查包的给定部分是过程还是函数

python - 将包含字符串的参数传递给 Django Raw sql 的正确方法

php - 数据库中的 200 个表太多了吗?

php - 将数组元素插入数据库字段MYSQL