# 引用

## 联系人管理应用的分组需求

-  需求详情
   1. 用于客户营销
   
   2. 有千万级联系人
   
   3. 需要频繁变动分组（group）的信息，如增加分组及修改名称，描述以及营销状态
   
   4. 一个分组可以有百万级联系人
   
   5. 如果是上述情况，schema还是内嵌分组的话，改动一个分组的信息，就要改动百万级别的记录，数量极其庞大
   
   6. 一般这种情况下，建议将分组抽出来单独做一个表
   
-  解决方案：Group使用单独的表

   1. 关系型设计

   2. 用id或者唯一键关联

   3.关联查询

   4. 拆表图

      ![image-20200714200615585](../img/modeling/img_19.png)

-  引用模式下的关联查询

   ![引用模式下的关联查询](../img/modeling/img_18.png)

## 联系人的头像：引用模式

- 头像字段单独拆出来一个表做引用

  1. 头像使用高保真，大小在`5MB-10MB`

  2. 头像一旦上传，一个月不可更换

  3. 基础信息查询（不含头像）和头像查询的比例为 `9：1`

  4. 建议：使用引用方式，把头像数据放到另外一个表，可以显著提示`90%`的查询效率

  5. 当然，头像也可以只存链接，真正的头像数据放在云文件服务器，如七牛云，阿里云等，数据库不用额外存头像这种占空间大的二进制数据

## 模式小结：引用

- 内嵌文档太大，数`MB`或者超过16`MB`
- 内嵌文档或数组元素会频繁修改
- 内嵌数组元素会持续增长并且没有封顶