NoSQL
特点:
- Not only SQL;
- 没有声明性查询语言;
- 没有预定义的模式;
- 键-值对存储,列存储,文档存储,图形数据库;
- 最终一致性,而非 ACID 属性;
- 非结构化和不可预知的数据;
- CAP 定理 ;
- 高性能,高可用性和可伸缩性;
- 是一个新的、令人兴奋的技术,并不是十分成熟;
从其特点分析,最适合无固定要求的组织数据。比如社交网络、客户管理和网络监控系统等。
就客户管理系统来说,假如刚开始使用关系型数据库建一个联系人的表,表字段有主键 id、姓名 name、电话 telephone、邮箱 email、地址 address。那么问题来了,现在有联系人有三个电话号码(住宅座机、移动电话、工作电话)需要输入,这时就要考虑单独创建一个 telephone 表,这样就不受限制了,也让我们的数据标准化了。新建 telephone 表结构:联系人 contact_id、号码类型 name、号码 num。email 与 address 也存在同样的问题,address 的情况更加复杂,这里不再展开。对关系型数据库来说,Schema 是固定不变的,而我们事先是不能预测所有字段的,比如刚才的联系人表,很快我们会发现当前字段不能满足,比如要添加性别 gender、年龄 age、生日 birthday 等字段,那么最后就导致需要加一个 otherdata 表。数据又是碎片化的,当查询一个联系人时,如果该联系人有 3 个电话号码、2 个 email 地址和 5 个地址,那么 SQL 查询需要检查所有表,并将产生 325=30 条结果,使得全文搜索很困难。
面对这种情况,如果选择 NoSQL 数据库,联系人列表将从中受益。数据库将一个联系人的所有数据存储在一个单独的文档里的 contacts 集合里。
[
{
name:"tom",
telephone:{
home:"123456",
mobile:"123456789",
work:"1234567890"
},
...
},
...
]
如果这时需要添加一些数据,这些数据没有必要应用到之前的联系人,NoSQL 数据库就可以随意添加或移除字段。联系人数据存储在单独的文档中,也使得全文搜索变得简单。
介绍完 SQL 与 NoSQL 数据库的基本概念,就该回到正题啦,介绍下 Node 嵌入式数据库,SQLite 同样也有 SQL 与 NoSQL 之分。
Nodejs 可用的 SQLite 有 node-sqlite,node-sqlite3,NeDB,nStore 以及 final-db 等。其中 node-sqlite,node-sqlite3 属于 SQL 数据库,NeDB,nStore 以及 final-db 属于 NoSQL 数据库。如需详细了解各个模块,可以去看相应的官方文档。
其中使用最多的应该算 node-sqlite3 和 NeDB 了,两者的区别很明显,前者是 SQL 数据库,后者是 NoSQL 数据库。另外,sqlite3 相对 NeDB 要重一些,性能也要差一点,使用 SQL 语句失去了 js 直接操作 json 的简便,API 也相对复杂很多。而 NeDB 只提供了基本的 CURD 操作,只能用于小型应用,大场景并不适用,数据加载到内存中进行操作,不适合内存非常紧张的应用,目前作者也没有给出具体的内存控制方法。。