|
知识路径: > 数据库技术 > 数据库技术基础 > 数据库模型 > 典型数据库:RDB(关系数据库)、OODB(面向对象数据库)、ORDB(对象关系数据库)、XML数据库、NoSQL(非关系数据库) > 非关系型数据库NoSQL > 相关理论基础 >
|
相关知识点:6个
|
|
|
|
不同的NoSQL数据存储提供的查询功能有重大分歧。然而设计的键值存储仅仅提供通过主键或一些id字段查找的功能,并且缺乏查询更进一步域的能力,而其他数据存储(像文档的数据库CouchDB和MongoDB)则允许某些复杂查询。在许多NoSQL数据库的设计中,相对于性能和可扩展性来说,丰富的动态查询功能已被省略的现状是并不奇怪的。另一方面,在使用NoSQL数据库时,有些情况下需要至少有一些非主键属性查询功能。
|
|
|
现在许多NoSQL数据库是基于DHT(Distributed Hash Table,分散哈希表)模型的。为了访问和修改对象数据,客户端要求提供对象的主键,然后数据库再根据提供的主键进行相等匹配。
|
|
|
例如,我们使用DHT实现一个顾客数据库,选择顾客编号cust_id作为主键。那么如果我们知道一个顾客对象的cust_id,我们就能进行get/set/operate操作了。
|
|
|
现实世界中,我们可能想要基于非主属性查找数据,我们也可能基于“大于/不小于”关系进行查找,或者我们可能用一个布尔表达式来组合查询条件。
|
|
|
|
|
一个最直接的方式是通过将NoSQL数据库拷贝到关系数据库或者文本数据库,来提供查询能力。当然,这就要求关系数据库要足够大以便能够存储每个对象的查询属性。由于我们仅仅将要查找的属性存到数据库中,而不是整个对象,故该方法是一个非常实用且常见的方法。结合SQL数据库的查询模型如下图所示。
|
|
|
|
|
|
一些NoSQL数据库提供本地数据库内的索引和查询处理机制。在这种情况下,我们可以让查询处理器将查询广播到DHT中的所有节点,在每个节点上将会执行查询,并将结果送回到查询处理器,然后查询处理器将结果聚集成一个单一响应。需要注意的是搜索并行地发生在DHT中所有节点上。分散/集合本地搜索的查询模型如下图所示。
|
|
|
|
|
|
B+树是一种用在关系型数据库管理系统中常见的索引结构。B+树的分布式版本可以用在DHT环境中。其基本思路是为了定位B+树的根节点哈希要搜索的属性。根节点的“值”包含其孩子节点的ID。因此,客户端为了找到孩子节点可以发起另一个DHT查找调用。继续这个过程,客户端最终向下导航到叶节点,从而与搜索条件匹配。紧接着,为了提取实际的对象,客户端将发起另一个DHT查找。
|
|
|
值得注意的是,对象的创建和删除将会引起B+树节点的拆分/合并更新。这应该以原子的方式进行。分布式事务是一项昂贵的操作,但它的使用在这里是合理的,因为大多数的B+树的更新很少涉及超过一台机器。分布式B+树的查询模型如下图所示。
|
|
|
|
|
|
前缀哈希表(Prefix Hash Table,PHT,又名分布式Trie)是一个树形数据结构。在这个树形结构中,从根节点到叶子的每一条路径上均包含了键值的前缀,并且每个Trie中的节点都包含了它是谁的前缀的所有数据。PHT主要包含三个操作:lookup、range query和insert/delete。前缀哈希表的查询模型如下图所示。
|
|
|
|
|