# 聚合数据模型
`数据模型`一般是指应用程序的特定数据所具备的模型,对于开发者而言,可能会指一张数据库的的`实体 - 关系图(entity-relationship diagram)`。然而本书中的`数据模型`通常表示数据库组织数据的方式,它的正式名称是`元模型`。
`表`又可称为`关系`,`行`又可称为`元组`。
`NoSQL`与传统的关系型数据库相比,一个最明显的转变就是抛弃了关系模型。
`NoSQL`生态系统中广泛使用的模型有以下四类:
* 键值数据库
* 文档数据库
* 列族数据库
* 图数据库
其中前三类数据库有一个共同特征,称为`面向聚合(aggregate orientation)`。
## 聚合
关系模型把待存储的信息分隔成元组(行)。元组是种是种首先的数据结构:它只能包含一系列的值,因此不能在元组中嵌套另一个元组,也不能包含由值或元组所组成的列表。
面向聚合所用的方式与之不同,我们通常操作数据时所用的单元,其结构都比元组集合复杂得多。如果能够以这种复杂的结构来存放列表或嵌套其他记录结构就好了。`键值数据库`、`文档数据库`、`列族数据库`都使用这种更为复杂的记录。一般把这种结构称为`聚合(aggregate)`。
一般情况下,我们通过`原子操作(atomic operation)`更新聚合的值,并且在与数据存储通信时,也以聚合为单位。
### 关系模型和聚合模型示例
一个电子商务网站,把商品通过网站卖给消费者,需要存储用户信息、商品目录、订单、收货地址、账单地址和付款方式等信息。使用关系模型,每张表不会出现重复数据,维护了表格间的`参照完整性`。如下图所示:
![](http://oczira72b.bkt.clouddn.com/17-10-29/3399438.jpg)
如果使用面向聚合的思想来做,如图所示:
![](http://oczira72b.bkt.clouddn.com/17-10-29/68750917.jpg)
使用`JSON`格式来表示:
```json
// in customers
{
"id": 1,
"name": "Martin",
"billingAddress": [
{
"city": "Chicago"
}
]
}
// in orders
{
"id": 99,
"customerId": 1,
"orderItems": [
{
"productId": 27,
"price": 32.45,
"p