应用程序不可避免地需要随时间而变化,在演化过程中,需要不断地添加或修改功能。在大多数情况下,更改应用程序功能时,也需要更改其存储的数据: 可能需要捕获新的字段或记录类型,或者需要以新的方式呈现已有数据。
当数据格式发生变化时,经常需要对应用程序代码进行相应的调整(例如,向记录中添加新字段,然后应用程序代码开始读取和写入该字段) 。然而,对于一个大型应用系统,代码更迭往往并非易事。
服务器端程序,可能需要滚动升级,每次将新版本部署到少数几个节点,之后再逐步推广到所有节点。
对于客户端应用程序,用户可能不会在一段时间内马上更新软件
这意为着新旧版本的代码,以及新旧数据格式,可能同时在系统中共存,所以保证数据的双向兼容性至关重要
数据兼容性
向后兼容性较新的代码可以读取由旧代码编写的数据
向前兼容性较旧的代码可以读取新代码编写的数据
向后兼容通常不难实现:只需要清楚旧代码所编写的数据格式,就可以比较明确的处理这些数据,对于向前兼容性,旧的代码需要忽略新版本代码中所做的添加
在本文中,将介绍多种编码数据的格式,包括JSON、XML、Protocol Buffers、Thrift。特别 ...
对于数据库来说,向它插入数据,它就保存数据,向它查询,它就返回那些数据,根据上文,当确定数据库的数据格式(文档模型,关系模型,图状模型)以及对应的查询语言(SQL、命令式查询)之后,本文将从数据库的角度来探索如何存入数据以及在受到查询时,如何找到数据。
数据库核心123456789#!/bin/bashdb_set () { echo "$1,$2" >> database}db_get () { grep "^$1," database | sed -e "s/^$1,//" | tail -n 1}
这两个函数实现了一个 KV 存储,当调用 db_set key value,将在 database 中保存 key value, 调用 db_get key ,会返回 key 对应的 value
它底层的存储格式其实非常简单 : 一个纯文本文件。其中每行包含一个key-value对,用逗号分隔 (大致像一个CSV文件,忽略转义问题) 。每次调用db_set即 ...
背景数据模型可能是开发软件最重要的部分,它们不仅对软件的编写方式,而且还对如何解决问题都有深远的影响。
大多数应用程序是通过一层一层叠加数据模型来构建的。每一层都面临的关键问题是: 如何将其用下一层来表示? 例如:
作为一名应用程序开发人员,通过实际要求,创建对应的对象以及数据结构。
当需要存储这些数据结构时,可以采用通用数据模型 (例如JSON或XML文档、关系数据库中的表或图模型) 来表示。
数据库工程师接着决定用何种内存、磁盘或网络的字节格式来表示上述JSON/XML/关系/图形数据。数据表示需要支持多种方式的查询、搜索、操作和处理数据。
在更下一层,硬件工程师则需要考虑用电流、光脉冲、磁场等来表示字节。
复杂的应用程序可能会有更多的中间层,基于底层API来构建上层API,但是基本思想相同: 每层都通过提供一个简洁的数据模型来隐藏下层的复杂性。
下文将介绍一系列用于数据存储和查询的通用数据模型,我们将比较关系异型、文档模型和一些基于图的数据模型。我们还将讨论多种查询语言并比较它们的使用场景。
关系模型与文档模型SQL现在最著名的数据模型可能是 ...
背景当今许多新型应用都属于数据密集型 (data-intensive) ,而不是计算密集型(compute-intensive) 。对于这些类型应用,CPU的处理能力往往不是第一限制性因素,关键在于数据量、数据的复杂度及数据的快速多变性。
数据密集型应用通常也是基于标准模块构建而成,每个模块负责单一的常用功能。例如,许多应用系统都包含以下模块:
数据库: 用以存储数据,这样之后应用可以再次访问。
高速缓存: 缓存那些复杂或操作代价昂贵的结果,以加快下一次访问。
索引: 用户可以按关键字搜索数据并支持各种过着。
流式处理: 持续发送消息至另一个进程,处理采用异步方式。
批处理: 定期处理大量的累积数据。
越来越多的应用系统需求广泛,单个组件往往无法满足所有数据处理与存储需求。因而需要将任务分解,每个组件负责高效完成其中一部分,多个组件依靠应用层代码驱动有机衔接起来。
设计原则设计数据系统或数据服务时,一定会碰到很多环手的问题。例如,当统内出现了局部失效时,如何确保数据的正确性与完整性?当发生系统降级 (degrade) 时,该如何为客户提供一致的良好表现?负载增加时,系统如何扩 ...