Key-Value型NoSQL数据库查询语言

  • 介绍在NoSQL之上实现一套类SQL的查询语言
  随着NoSQL的概念被广泛接受后,产生了许多的key-value形式的NoSQL数据库,而这些已经被各大互联网公司以及众多的数据库厂商所接受并广泛的使用在现有的系统中。Key-value相对应传统的数据库基于结构简单,适用于当今众多的互联网需求;但是对于这些key-value NoSQL数据库所使用的查询语句,相对与传统的SQL描述性查询语句来说其存在着使用繁琐复杂,无法直观的描述用户操作行为,例如:MongoDB等。

关系数据库作为当今使用范围最广而且应用最为普遍的数据库已经被大量的应用在各个行业中,结构化查询语言(SQL,structural query language)则在关系数据库中扮演着重要的角色,SQL定义了一套完整的用来操作关系数据的语法:数据定义语言(DDL, data define language),数据操作语言(DML, data manipulation language)。为了使得众多的关系数据库用户可以保留其操作习惯,本文给出了一种类SQL的查询语言,用来解决key-value NoSQL数据库的查询。

给出了一种类SQL的查询语言,该语言用来描述基于key-value数据库的查询语言。基于该查询语言,用户可保留关系数据库的SQL语言习惯,同时通过查询语言可以更好的描述用户操作意图,并使得对于key-value数据库的查询优化成为可能。

由于key-value数据库中的数据组织形式多为key-value对的形式,而value中又可以嵌套描述为key-value对的形式,如下形式数据结构:

(1){key1, {key2, {key3, value3} as value2}as value1}或者是(2){key1, value1}, {key2, value2}, {key3, value3},不失一般性对于所有的key-value数据均可以由形式(1)来描述。

对于上述的形式我们可以将该key-value对描述为一个二叉树形结构:将key值做为做子树,而右子树为value,因此我们可以按照二叉树的遍历方式来完成对于key-value形式的数据库的查询。

对于上述的形式为(1)的key-value数据如果我们想查询key值为key3的数据,传统的key-value数据库的做法有以下两种方式:(1)不支持此类型的嵌套数据结构,此时需要数据库用户对数据库中的数据结构进行去嵌套修改;(2)通过使用中间变量来完成此类的查询,此种方式由于需要中间变量的使用,使得在做此类查询时候需要用户编写大量的代码并进行相应的逻辑操作,这增加了对于该种key-value类型数据库的使用成本。

对于上述的数据将进行合理的管理,需要将数据按照其逻辑关系组织成为一个簇,我们称之为:容器(container)。例如将关于交易的数据放入在一个名为:transaction的容器中,其与关系数据库中的表的概念想对应。

因此,基于上面的问题我们提出了一个全新的适用于key-value类型的NoSQL数据库查询语言。

为实现一种能够适应于key-value类型的NoSQL的查询语言,首先需要规定一定语法规则和相应的关键字,基于上述说描述的数据结构, 我们给出两大类的查询语言:数据操作语言(DML, Data Modify Language),数据定义语言(DDL, data define language)。与关系数据库中对于DML,DDL描述相同,其中DML中包含了所有关于数据操作的所有相关语言,DDL中包括所有关于数据的定义语言。

而在DML中,我们又分为三类数据修改类型:增加数据,删除数据,修改数据,查询数据等,即增删改查操作; 在DDL中,创建容器。删除容器等。

    • 数据修改语言(Data Modify Language, DML)
    • 1) 数据查询:

      数据查询语言是一个数据库中使用最为频繁的语句之一,其主要的作用是从用户指定的数据源中查询符合条件的数据集。 由于key-value其数据结构的特点知,对于key-value此类的NoSQL数据库并无关系数据库中列的概念,因此根据key-value的特点,将key-value类型的NoSQL数据按照路径的形式进行查询。 例如对于如下数据:

                   {”book”, {“title”, {”subtitle”, “Harry Potter”} as title} as book}

      被加载到一个名字为:books的容器中,而该容器保存在数据库名为db的数据库中。查询subtile的数据,传统的key-value数据库中的做法是 使用find函数来查询数据:例如:xx.xx.find.(book.title.subtitle:{$eq:”Harry Potter”})。从上述的使用可以看出对于传统的关系数据库用户来说,上述查询语言属于传统的函数语言,而非传统的描述性查询语言。为了减少key-value此类的NoSQL数据用户使用负担,我们定义一套描述性查询语言,来完成现有的key-value数据库的函数语言。

                   SELECT book.title.subtitle FROM db.books WHERE book.title.subtile =”Harry Potter”

      或者:

                  SELECT $val=book.title.subtitle FROM db.books WHERE $val=”Harry Potter”

      其中:book.title.subtitle描述了数据所在容器中的那个路径下面;db.books描述了数据是从那个数据库中的那个容器取得;book.title.subtile =”Harry Potter”条件描述了返回数据所需要满足的条件。其相应的语法格式为:

                  SELECT [$var=]path FROM source WHERE [$var=] wpath= condition

      其中: [] 表明该符号内的内容非强制性,必须出现在语句中;其中path为用户相应所查询数据所在路径,例如:上例中的book.title.subtitle;source表明了用户所查询数据源;wpath= condition表明了所返回数据所具有的条件信息。$val为变量代表:变量等价于其所表示内容,例如:$val = path;则$val与path为等价关系。
      从上面语言可以看出,其保持了关系数据库类似的查询语言习惯。使得关系数据库用户可以很快的学习并使用该查询语言进行数据库的相关操作。其中:大小写不敏感,其中黑体字为关键字(下同)。
      2) 数据增加:
      同数据查询一样,数据的增加也是DML中的一个重要的功能,其作用是将新增的数据增加到指定的数据库的指定路径下。其中增加数据的语法格式如下例所示:

                   insert into db.books.book.title values {“author”,”Brad.Pitt”}

                  insert into db.books.book values {“book2”,{“subtitle2”,”Magic”}}

      其中的insert into为系统关键字,而db.books.book .title或者db.books.book为数据库用户所要要插入的目标路径地址,该路径地址指明了将数据插入到哪条路径下面,关键字values则表明了需要增加的数据。而相应的key-value型的NoSQL数据库所采用的方式db.books.insert (…);此类方式与传统的关系数据库中所采用的描述性查询语言不同,其采用的是函数调用方式。为了保持保存现有众多关系数据库用户的使用习惯,而又能够方便的使用key-value NoSQL数据库,我们使用insert into的关键词来描述用户进行数据插入的动作,其语法格式为:

                  INSERT INTO path VALUES values

      3) 数据删除:
      数据删除,其被用来为数据库用户删除满足指定条件的相应数据,其删除语法形式入下例所示:

                   DELETE [$val=] book.title.subtitle FROM db.books WHERE [$val=] book.title.subtitle =”Magic”

      其中,DELETE, FROM, WHERE为相应的关键字,其中book.title.subtitle为所要删除数据所在的路径,其等同于关系数据库中的所删除的目标列;db.books为要删除数据所在的数据源,其等同于关系数据库中所删除目标列所在的表;book.title.subtitle =”Magic”为所删除数据所需要满足的条件,只有满足该条件的相应数据才会被删除。从上面的语法可以看出,不同与传统key-value NoSQL数据库删除数据所使用的方法:db.collection.remove()方法,我们的方法具有简洁明了,符合传统关系数据库用户习惯,是的用户学习成本大大下降。 其语法如下:

                   DELETE path FROM source WHERE condition

      4) 数据修改:
      数据修改,其主要的作用是在当源数据发生变化后,相应的更新数据库中的数据。其相应的更新语法格式如下例所示:

                   UPDATE path =value FROM source WHERE condition

      其中: UPDATE, FROM, WHERE为关键字,path为所要更新数据的路径,source为被更新数据所在的数据源,condition为被更新数据所需要满足的条件。 例如: Update book.title.subtitle = {“subtitle3”,”MagicS”} FROM db.books WHERE book.title.subtitle = {“subtitle2”,”Magic”}
    • 数据定义语言(Data Define Language, DDL)
    • 数据定义语言主要的作用是:完成对数据库中的对象进行描述并定义。对于key-value类型的NoSQL ,其与关系数据库所不同的就是:对于key-value类型的NoSQL数据库不存在关系表的概念去而代之的是:集合(collection)的概念,其是一个逻辑的概念,描述了逻辑上相同数据的一个集合。从上面讨论可知,对于key-value类型数据,其中的key和value的数据类型可以分别为:int, string ,double, 或者是一个key-value pair对,int, string double, pair为给定的内置数据类型。因此,我们可以容如下的语法形式来给出创建一个collection的语法描述:

                   CREATE COLLECTION collection_name ( “key_name” TYPE, “value_name” TYPE)

      其中,CREATE COLLECTION为创建collection的关键词,collection_name为所创建容器的名称,TYPE为上述中的int, string, double, pair。相应的例子如下:

                   CREATE COLLECTION book (“title” string, “subtitle” string)

本文一种新型的key-value类型的NoSQL数据库查询语言。对于较于传统的方式下需要相关人员对于key-value类型的NoSQL数据库所有提供的查询函数相当了解,这必然会增加数据库的维护成本。相对于传统方式新的方法本发明给出了一种新的描述式查询语言,而查询语言保留了大量关系数据库用户习惯的基础上,使得key-value类型的数据库用户可以很快的学习并使用该描述性查询语言来替代传统的NoSQL数据库所提供查询函数,从而减少了key-value类型NoSQL用户的学习使用成本也极大的提高了NoSQL数据库的维护性。