我看到了两种可能性:sqlite
和伯克利数据库。因为我的用例是
显然没有关系,我很受诱惑
与 BerkeleyDB 一起去,但我不
真的知道我应该如何使用它
存储我的记录,因为它只存储
键/值对。
您所描述的正是关系的含义,即使您只需要一张表。 SQLite 可能会让这很容易做到。
编辑: 关系模型与表之间的关系没有任何关系。关系是其他集合的笛卡尔积的子集。例如,实数、实数和实数(是的,所有三个都相同)的笛卡尔积产生 3d 坐标空间,您可以使用公式在该空间上定义关系,例如 x*y = z。每个可能的坐标集(x0,y0,z0) 如果它们满足给定的公式,则它们要么在关系中,要么不在关系中。
关系数据库使用这个概念,但有一些额外的要求。首先,也是最重要的,关系的大小必须是有限的。上面给出的乘积关系不满足这个要求,因为满足公式的三元组有无穷多个。还有许多其他考虑因素与解决实际问题的真实计算机上的实用性或有用性有关。
思考问题的更好方法是考虑每种类型的持久性机制在哪些方面比另一种更有效。您已经认识到,当您有许多必须支持它们之间的关系(外键约束)的单独数据集(表)时,关系解决方案是有意义的,这几乎不可能通过键值存储来实施。关系的另一个真正优势是它可以通过使用适当的索引来实现丰富的即席查询。这是数据库层实际理解它所代表的数据的结果。
键值存储有其自身的优势。其中一个更重要的是键值存储扩展的方式。 memcached、couchdb、hadoop 都使用 key-value 存储是没有关系的,因为很容易将 key-value 查找分布在多个服务器上。另一个可以很好地存储键值的领域是当键或值是不透明的时,例如当存储的项目被加密时,只能被它的所有者读取。
为了强调这一点,即使您不需要多个表,关系数据库也能很好地工作,请考虑以下(非原创)
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";
其中,显然使用一个表:workswith 来计算每个演员的培根数为 6