Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我应该使用哪个数据库来存储记录,我应该如何使用它?_C++_Python_Database_Persistence - Fatal编程技术网

C++ 我应该使用哪个数据库来存储记录,我应该如何使用它?

C++ 我应该使用哪个数据库来存储记录,我应该如何使用它?,c++,python,database,persistence,C++,Python,Database,Persistence,我正在开发一个可以存储大量记录的应用程序。这些记录类似于(URL、日期、标题、源、{可选数据…}) 由于这是一个客户端应用程序,我不想使用数据库服务器,我只想将信息存储到文件中 我希望这些文件可以从各种语言(至少是python和C++)读取,因此一些特定于语言的东西,比如python的pickle,已经不存在了 我看到了两种可能性:sqlite和BerkeleyDB。由于我的用例显然不是关系型的,我很想使用BerkeleyDB,但是我真的不知道如何使用它来存储我的记录,因为它只存储键/值对 我的

我正在开发一个可以存储大量记录的应用程序。这些记录类似于(URL、日期、标题、源、{可选数据…})

由于这是一个客户端应用程序,我不想使用数据库服务器,我只想将信息存储到文件中

我希望这些文件可以从各种语言(至少是python和C++)读取,因此一些特定于语言的东西,比如python的pickle,已经不存在了

我看到了两种可能性:sqlite和BerkeleyDB。由于我的用例显然不是关系型的,我很想使用BerkeleyDB,但是我真的不知道如何使用它来存储我的记录,因为它只存储键/值对


我的推理正确吗?如果是,我应该如何使用BDB来存储我的记录?你能把我和相关信息联系起来吗?还是我错过了一个更好的解决方案?

怎么办?我还没有尝试过,但它似乎很有趣。

BerkeleyDB很好,还可以看看*DBM的化身(例如GDBM)。但最大的问题是:你需要搜索什么?您需要按该URL、一系列URL或您列出的日期进行搜索吗

也可以将记录组作为简单文件保存在本地文件系统中,按日期或搜索词分组(&c)

回答“搜索”问题是最大的开始


至于键/值,您需要确保的是,键本身与您的查找一样定义良好。例如,如果有时需要按日期查找,有时需要按标题查找,则需要维护一个“记录”行,然后可能需要维护两个或更多参考原始记录的“索引”行。您几乎可以在键/值存储中对任何内容进行建模

我看到了两种可能性:sqlite 还有伯克利。就像我的用例一样 显然不是关系,我很受诱惑 去伯克利,但我不知道 真的知道我该怎么用它来 存储我的记录,因为它只存储 键/值对

您所描述的正是关系的含义,即使您只需要一个表。这样做可能会很容易

编辑:关系模型与表之间的关系无关。关系是其他集合笛卡尔积的子集。例如,实数、实数和实数(是的,三者都相同)的笛卡尔积生成三维坐标空间,您可以使用公式定义该空间上的关系,例如
x*y=z
。每个可能的坐标集
(x0,y0,z0)
要么满足给定公式,要么不满足

关系数据库使用这个概念,并附带一些额外的要求。首先,也是最重要的,关系的大小必须是有限的。上面给出的乘积关系不满足这个要求,因为有无限多个3元组满足这个公式。还有许多其他的考虑因素,更多的是关于在真正的计算机上解决实际问题的实用性或有用性

思考这个问题的一个更好的方法是思考每种类型的持久性机制在哪里比另一种更有效。您已经认识到,当您有许多独立的数据集(表)必须支持它们之间的关系(外键约束)时,关系解决方案是有意义的,这几乎不可能通过键值存储来实现。关系数据库的另一个真正优势是,它通过使用适当的索引使丰富的即席查询成为可能。这是数据库层实际理解它所表示的数据的结果

键值存储有其自身的一系列优点。其中一个更重要的是键值存储向外扩展的方式。因此,所有服务器都使用键值存储,因为它很容易跨多个服务器分发键值查找。键值存储工作良好的另一个方面是当密钥或值不透明时,例如当存储的项被加密时,它的所有者只能读取


为了驱动这个点,关系数据库工作得很好,甚至当你不需要一个以上表时,考虑下面的(不是原创的)


显然,它只使用一个表:
workswith
来计算每个参与者的bacon数为6

就我个人而言,无论如何我都会使用sqlite。它一直只对我(以及与我一起工作的其他人)有效。当你的应用程序增长,你突然想做一些更复杂的事情,你就不必重写了


另一方面,我在Python开发列表上看到了关于Berkely DB的各种评论,这些评论都表明它并不完美;您只获得dict样式的访问(如果您想选择某些日期范围或标题而不是URL,该怎么办);而且它甚至不在Python 3的标准库集中。

如果只使用一个字段来查找记录,那么简单的键值存储将是一个不错的选择。将该单个字段(或任何其他唯一ID)存储为键,将每个记录序列化为字符串(使用JSON或类似方法),并将该字符串存储为值。Berkeley DB当然是键值存储的合理选择,但有很多选择:

如果您想通过几个字段中的任何一个来查找记录,出于开发目的,SQLite可能是最简单的。您将使用SQL编写查询,但不必维护数据库服务器。所有的多键机器都已经为您编写好了

如果你真的想避免SQL或者从数据存储中挤出每一个性能,你需要多键访问,那么在关键值存储的顶部考虑一层额外的逻辑。通过序列化记录并将每个记录的“列”值插入为附加键(其值为

SELECT t1.actor1 
FROM workswith AS t1, 
     workswith AS t2, 
     workswith AS t3, 
     workswith AS t4, 
     workswith AS t5,
     workswith AS t6
WHERE t1.actor2 = t2.actor1 AND
      t2.actor2 = t3.actor1 AND
      t3.actor2 = t4.actor1 AND
      t4.actor2 = t5.actor1 AND
      t5.actor2 = t6.actor1 AND
      t6.actor2 = "Kevin Bacon";