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

sta*_*tti 5 c++ python database persistence

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

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

我希望这些文件可以从各种语言中读取(至少是python和C++),所以像python的pickle这样的语言特有的东西不在游戏中.

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

我的推理是否正确?如果是这样,我应该如何使用BDB存储我的记录?你能把我链接到相关信息吗?或者我错过了更好的解决方案?

Sin*_*ion 5

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

你所描述的正是关系的意义所在,即使你只需要一张桌子. SQLite可能会让这很容易.

编辑:关系模型与表之间的关系没有任何关系.关系是其他集合的笛卡尔积的子集.例如,实数,实数和实数的笛卡尔积(是的,三者都相同)产生三维坐标空间,你可以用公式定义该空间的关系x*y = z.(x0,y0,z0)如果它们满足给定的公式,则每个可能的坐标集都在关系中,否则它们不是.

关系数据库使用此概念以及一些额外要求.首先,最重要的是,关系的大小必须是有限的.上面给出的产品关系不满足该要求,因为有无限多的3元组满足公式.还有许多其他考虑因素与实际计算机解决实际问题的实际或有用之处有关.

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

键值商店拥有自己的一系列优势.其中一个更重要的是键值存储扩展的方式.memcached,couchdb,hadoop 都使用键值存储是没有意义的,因为很容易在多个服务器上分发键值查找.键值存储运行良好的另一个领域是当键或值不透明时,例如当存储的项目被加密时,只有它的所有者可读.


要将这一点推向家庭,即使您不需要多个表,关系数据库也能正常工作,请考虑以下内容(非原创)

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";
Run Code Online (Sandbox Code Playgroud)

其中,显然使用单个表:workswith计算培根数为6的每个演员