SQL中的Python集合字典

SQL中的Python集合字典,python,sql,database,dictionary,sqlite,Python,Sql,Database,Dictionary,Sqlite,我有一个Python字典,其中键是整数,值是整数集。考虑到潜在的大小(数百万个键值对,其中一个集合可以包含1到数百个整数),我希望将其存储在SQL(?)数据库中,而不是使用pickle序列化以存储它,并在需要时将其加载回数据库 通过阅读,我看到了两种可能的方法,都有其缺点: 序列化集合并将它们存储为blob:这样我将得到一个包含两列的SQL,第一列是字典的键,作为整数主键,第二列是blob,包含一组整数。 缺点:如果不加载完整的BLOB,就无法再修改集合,在向其添加值后,将其序列化并作为BLO

我有一个Python字典,其中键是整数,值是整数集。考虑到潜在的大小(数百万个键值对,其中一个集合可以包含1到数百个整数),我希望将其存储在SQL(?)数据库中,而不是使用pickle序列化以存储它,并在需要时将其加载回数据库

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

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

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

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

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

我对Python有点陌生,尤其是对数据库,所以如果我的问题不清楚,请告诉我。:)

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

  • 设置ID
  • 钥匙
  • 价值观
然后,我将在集合ID和密钥上创建一个复合主键,以确保组合是唯一的:

CREATE TABLE something (
  set, 
  key, 
  value, 
  PRIMARY KEY (set, key)
);
现在,您可以将值直接添加到特定集合中(或更新集合中的关键点),并选择集合中的所有关键点

也就是说,您的第一个策略对于读取繁重的工作负载更为优化,因为索引的大小会更小

SQL数据库(sqlite)仍然可以作为哈希表使用吗


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

谢谢!主键(set,KEY)很有意义,必须深入研究如何使用数据库。B树的时间复杂度为O(log(n)),这比我认为哈希表通常具有的O(1)还要差,而python中的字典具有(?)。任何从数据库中取出一个项目的方法都有O(1)?O(log(n))是非常非常有效的,除非您进入数十亿/万亿行范围,否则不应该成为问题。这也仅适用于随机访问查找。哈希表中的任何类型的范围查找都是O(n)最小值,而SQL索引中的范围查找都是O(k)(与您正在查询的数字而不是整个数据集成比例)。如果需要进一步扩展,则需要查看基于哈希表的键值数据库,如Couchbase或Redis。这样做的缺点是在一个集合中查找所有记录是很困难的,并且需要它自己的索引,这在一些KV数据库中是有特点的。好的,谢谢,澄清了很多!我之所以想使用真正的哈希表,是因为最初的算法(我正在构建我自己的Shazam作为一个爱好问题)是围绕这个想法构建的。录制一首歌的每一秒我都需要从数据库中拿出十几个完整的集,大概有一百万个不同的集,但我可以想象你是对的,一个O(log(n))或O(1)还不能真正起作用,所以我会尝试一下你的想法!听起来是个有趣的项目。在本例中,我建议您确保充分抽象代码,以便轻松切换后端。e、 将其封装在一个类中,这样您甚至可以尝试不同的实现并比较它们。如果绩效是一个问题,那么在做出决定之前一定要进行衡量!