数据模型与查询语言

一、数据模型

主流的数据模型包括:关系模型、文档模型、图状数据模型

1、关系模型

数据被组织成关系,在SQL中成为表(table),其中每个关系都是元组(turples)的无序集合(在SQL中成为行)

2、文档模型

也就是NoSQL,采用它有这样几个驱动因素,包括:
  • 适用于一对多的数据模型
  • 比关系数据库更好的扩展性需求,包括支持超大数据集或超高写入吞吐量
  • 普遍偏爱免费和开源软件而不是商业数据库产品
  • 关系模型不能很好地支持一些特定的查询操作
  • 对关系模式一些限制性感到沮丧,渴望更具动态和表达力的数据模型
  • MySQL执行Alter Table时会把现在的整张表复制,因而当表很大时可能会需要几分钟甚至几小时的停机时间,尽管现在有各种辅助工具可以解决这个限制
文档模型的劣势:
  • 文档模型不适用于表达多对多的关系
  • 适用需要同时访问文档大部分内容的场景。由于数据库通常会加载整个文档,如果应用只是访问其中的一小部分,则对于大型文档数据来讲就有些浪费。
  • 对文档更新时,通常会重写整个文档,而只有修改量不改变源文档大小时,原地覆盖更新才更高效。因此,通常建议文档应该尽量小且避免写入时增加文档大小。
文档数据库有时被称为无模式,但这具有误导性,因为读数据的代码通常采用某种结构因而存在某种隐形模式,而不是数据库强制执行。更准确的术语应该是读时模式(数据的结构是隐式的,只有在读时才解释),与写时模式相对应。读时模式类似编程语言中的动态(运行时)类型检查,而写时模式类似于静态(编译时)类型检查。

3、图状数据模型

  • 非常适用于多对多关系的数据模型
  • 图由两种对象组成:顶点(也成为节点或实体)和边(也称为关系)。
  • 可以建模为图的典型例子:社交网络(顶点是人,边指示哪些人彼此认识);Web图(顶点是网页,边表示与其他页面的HTML链接)
  • 图并不局限于同构数据,图更为强大的用途在于,提供了单个数据存储区中保存完全不同类型对象的一致性方式。

二、数据查询语言

1、查询语言分类

  • 声明式查询语言
select * from animals where famiy='Sharks'
  • 命令式查询语言
function getSharks(){
    var sharks = [];
    for(var i=0; i<animals.length; i++){
        if(animals[i].family === "Sharks"){
              sharks.push(animals[i]); 
         }
     }
     return sharks;
}
 
声明式查询语言比命令式API更加简洁和容易使用。更重要的是,它对外隐藏了数据库引擎的很多实现细节,这样数据库系统能够在不改变查询语句的情况下提高性能。

2、MapReduce查询

 
db.observations.mapReduce(
    function map(){
       var year = this.observationTimestamp.getFullYear();
        var month = this.observationTimesstamp.getMonth()+1;
        emit(year + "-" +month, this.numAnimals);
 
    },
    function reduce(key, values){
          return Arrays.sum(values);
    },
    {
          query:{family : "Sharks"},
          out: "monthlySharkReport"
    }
);
 

3、Cypher查询语言

最早为Neo4j图形数据库而创建(它以电影“黑客帝国”中的一个角色命名,与密码学中的密码无关)
 
  •  建模需求
  • 采用图数据库建模及查询的方式
 
 
 
 
  • 采用关系数据库建模及查询的方式
 
 
 
如果相同的查询可以用一种查询语言写4行代码完成,而另一种查询语言则需要29行代码,这足以说明不同的数据模型适用于不同的场景。因此,选择适合应用程序的数据模型非常重要
posted @ 2019-03-09 11:15  Ronzy  阅读(674)  评论(0编辑  收藏  举报