# 第二章 数据模型和查询语言

数据模型不仅仅影响软件的编写方式,还影响这我们的解题思路

多数应用使用层层叠加的数据模型构建。对于每层数据模型的关键问题是:它是如何用低一层数据模型来表示的?

基本思路是:每层通过提供一个明确的数据模型来隐藏更低层次中的复杂性

  • 关系模型与文档模型
    • 关系模型起源商业数据处理:事务处理、批处理(报告、报表)
    • 文档模型:不仅是SQL(Not Only SQL),驱动因素:
      • 大数据集、高吞吐
      • 免费开源
      • 关系数据库不能支持一些特殊的查询
      • 更多动态与表现力的数据模型
    • 对象关系不匹配
      • 对象关系映射(ORM object-relational mapping) 框架可以减少这个转换层所需的样板代码的数量,但是它们不能完全隐藏这两个模型之间的差异
      • 后续的 SQL 标准增加了对结构化数据类型和 XML 数据的支持;这允许将多值数据存储在单行内,并支持在这些文档内查询和索引(当然不支持的只能将数据直接编码比如 JSON 后存入单行,缺点就是通常无法查询这一列)
    • 多对一和多对多的关系
      • 如果用户界面一个自由文字字段输入行业或者区域,一种是存储纯文本,一种是给出标准化列表供选择。后者的优势为:样式统一、避免歧义、易于更新、i18n、更好的搜索支持
      • 存储 ID 还是字符串,这是个 副本 问题
      • 存储 ID 的意义在于 ID 永远不需要改变,而其信息可能会发生变化。去除此类重复信息是数据库 [[ 规范化 ]](normalization)的关键思想。
      • 但是这种数据进行规范化需要多对一的关系,这和文档模型不太符合。文档数据库对一对多支持通常很弱。
      • 即使程序最初版本是无连接的,但是随着功能的增加,数据会变得更加互联
    • 文档数据库是否在重蹈覆辙?
      • 如何在数据库中更好的表示多对多关系?
      • IBM 信息管理系统(IMS)使用了成为 层次模型(hierarchical model) 的数据模型,和 JSON 类似
      • IMS 能良好的处理一对多,但是很难应对多对多,不支持连接,开发人员需要自己决定是否复制(非规范化)
      • 人们提出 关系模型(relational model)网络模型(network model)
      • 网络模型
      • 关系模型
      • 与文档数据库相比
    • 关系型数据库与文档数据库在今日的对比