数据模型与查询语言
一、数据模型
主流的数据模型包括:关系模型、文档模型、图状数据模型
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行代码,这足以说明不同的数据模型适用于不同的场景。因此,选择适合应用程序的数据模型非常重要