导购:为应用程序选择合适的数据存储

你正在处理什么类型的数据?我们将数据分为下面五种类型,当然这不是一个全面的分类,但它有助于我们加深对数据存储需求的认识。

1、包含相同类型元素的同质数据阵列

2、多媒体 – 音频,视频和图像文件

3、仅供内部使用的临时数据(各种类型的日志和缓存)

4、各种类型的计算数据流(如录制的视频流,大量的计算结果等)

5、文档(简单的或混合的)

存储数据的方法也有下面五种形式:

1、文件系统中的文件

2、数据库

3、结构化存储

4、归档文件(结构化存储的一种特殊格式)

5、远程存储(云,分布式存储)

下面我们来探讨一下哪种存储机制最适合前面描述的五种数据类型。

结构化数据的存储问题

同质数据阵列包含相同类型的元素,如一段时间范围内的温度测量值,某一年的股票连续变化值等等。

1、对于同质数据阵列,普通文件无法提供方便和快速搜索能力,你必须创建,维护和不断更新特殊的索引文件,数据结构的修改几乎是不可能的,元数据信息也是有限的,没有内置运行时数据压缩和加密功能。

2、关系数据库非常适合存储同种数据,它们包含一套用严格的内部格式预定义的记录,关系数据库的主要优点是可以根据指定的条件快速定位数据,以及数据完整性的事务支持,但关系数据库也有显著的缺点,如对于可变长大尺寸数据就不能很好地处理,BLOB字段常常用来独立存储这种类型的数据,此外,在关系数据库中保存数据需要:a)使用特定的DBMS,数据和应用程序本身的可移植性将受到严格限制,b)必须预先计划好数据结构,包括相互关联的链接和索引策略等,c)需要为高效的数据库开发详细研究高峰时的负荷,这可能是一个严重的系统开销。

3、结构化存储优点类似于文件系统,可以放在任何位置,如磁盘上的一个文件,一条数据库记录,甚至可以放在内存中,这个方法的主要好处是它可以在现有存储中高效地添加或删除数据,为不同大小的数据提供高效的操作(从小到大),存储代表独立的单元(文件),因此可以很容易实现迁移,复制和备份,不需要跟踪应用程序产生的所有文件。此外,借助日志,可以实现内容完整或部分恢复,其缺点是在海量数据阵列中搜索时相对会慢一些。

4、zip压缩文件,作为结构化存储的一种特殊形式,可以用于存储同质数据阵列,但只适用于大多数访问是只读操作的时候,zip标准格式使其使用更加简单,特别是跨平台的应用程序,但这个格式并不适合数据打包后被修改的情况,因为向zip压缩文件包中添加或删除数据都是一个很费时的操作。

5、远程和分布式存储是下一代存储方式,真实的数据位置和数据访问对于应用程序来说是透明的,这些任务由经过封装的特殊层实现,数据可以分布式存储在数据库或文件系统中,最终用户无需关心数据的组织方式,只需要关注通过API或文件系统调用访问得到的一组对象,一个最好的例子就是云存储,它可以提供统一的数据访问,不需要考虑数据是如何存储的,这种方法的缺点是不易于管理和控制,备份或迁移数据也很复杂。

音频,视频和图像文件

存储单个(或多个)多媒体文件很简单,但当你需要维护大量的文件,并想跨多媒体文件集搜索时情况就变得复杂了。

1、只有非常简单和数量非常少的多媒体文件可以作为普通文件存储,即使是一个普通的家庭收藏,基于简单文件的多媒体数据存储很快就会变得无法控制,主要是由于这些文件的大小,无法处理任何注释,标签或元数据,复制和转移的速度很慢。

2、关系数据库用于存储音频,视频或类似类型的数据是不确定的,一般来说,关系数据库是不适合存储大型BLOB字段的,特别是那些大尺寸的视频文件,每种数据都需要它自己的表(用于存储不同的元数据),但另一方面,关系数据库提供了强大的搜索能力,非常适合只读类型的数据。

3、当存储支持元数据和快速搜索功能时,结构化存储也非常适合保存多媒体文件,如果不支持这种搜索,那结构化存储就成为了文件系统的变种。

4、远程和分布式存储是最适合用于保存视频,音乐或类似数据的了,存储代表一个单一的单元,所有多媒体或视频游戏元素均可以安全存放,即便丢失一个很重要的文件也不会有风险,如果存储支持标签和元数据,搜索速度将会很快。

临时数据

临时数据一般是软件在运行期间产生的,都有一个有效期,许多临时数据变化非常频繁,此外,这些中间信息应该易于访问,完整,在大多数情况下应该加密保证其安全,使用普通文件来存储临时数据仍然是可以的,但这样做会导致很高的资源消耗,并且没有可靠的方法控制和保证数据的完整性,加密也需要你的软件来实现。

1、长时间文件已经作为存储临时数据的一种方法,它们非常适合存储低优先级,不固定,规模不大的数据,与此同时,一些国家的法律对临时数据的处理也很谨慎和敏感,因此,考虑数据安全和数据保护角度来看,普通文件系统已经不适合存储临时数据了。

2、关系数据库也不适合存储临时数据,因为临时数据缺少定义清晰的结构和元素之间的相互关联属性,与此同时,关系数据库可以存储与数据库本身和它的操作相关的临时数据,数据库也可用于某些类型的数据缓存,或用于存储活动日志(日志文件),但如果临时数据需要长期存储(长达数年)或需要签名或加密,关系数据库也不适合。

3、当有大量的临时数据需要存储,访问,索引和搜索,压缩和加密时,结构化存储可能是最理想的解决方案,它还可以为数据移除或替换提供简单的办法,这样的存储可以更容易复制或移动,无需特别关注维护数据的完整性。

4、zip压缩文件很少用于存储临时数据,临时数据要求能快速访问,这限制了将其存储在压缩文件中的可能,仅当需要存储快照,并需要防止丢失时,加密的压缩文件适合这种特殊的数据。

5、远程和分布式存储用于保存临时数据流基本上是出于空间的考虑,它不能提供良好的速度,管理和备份也很麻烦,但却经常用于存储临时数据。

数据流

快速产生的大量数据,如输出数据源(feed),需要高效地存储,普通文件系统会限制文件大小,需要为数据溢出设计特殊的处理程序,要以牺牲数据完整性和可靠性为代价,由于这种类型的数据通常包含特权或敏感的信息,必须在运行时实现快速加密,同样,数据压缩效率也很重要,因为这些数据源的大小通常是很重要的。

1、普通文件不适合存储这种类型的数据,快速增长的文件大小需要创建许多中间缓存文件,即使进行了精心设计,内存或媒体的消耗也会呈几何级增长,处理、索引、搜索和加密存储在普通文件中的数据流将会成为噩梦。

2、用关系数据库存储数据流和普通文件面临的问题一样,加上数据库更新的效率很低,结构严格,因此关系数据库可能是最不适合用来存储流数据的存储解决方案。

3、仅当需要高度安全的时候,数据库适合存储数据流,但需要以快速搜索为代价,数据可以被压缩,但想要实现快速的搜索几乎是不可能的。

4、结构化存储在安全,效率和数据完整性方面均有优势,数据存储是单个自治的文件单元,可以轻松实现转移或复制,访问简单而高效,保存在其中的数据流可以加密,能有效预防被篡改,分区为存储用户提供了另一个方便,存储将会根据数据大小自动增长。

5、远程和分布式存储也很适合存储数据流,通常在产生大量数据的项目中会这么使用,由于这些数据经常被分布式系统或集群分析,使用远程存储是最合适的,这种存储不仅提供了方便,还可以很好地控制数据访问,能有效地阻击恶意篡改或删除数据。

文档

文档通常是结构严谨的数据类型,特别是那些存储人类可读的文本或图像信息的文档,在企业和个人活动中,文档是信息存储最常见的一种形式。

1、文件是存储文档最常见的一种形式,但当需要并发访问同一个文档时,使用普通文件就很复杂了,因为所有混合的文档结构都是连续存储在一个平面文件中的,任何对文档的修改操作都需要创建一个临时文件,它包含了所编辑文档元素的一个子集。此外,删除文档中的任何元素不会自动减少文件大小,如果想优化文件大小,必须创建一个文档副本,然后保存为另一个文件,等编辑操作完成后,源文件必须删除。

2、关系数据库也可以用来存储某些类型的文档,如果在运行时能转换成明文文本,将可以提供高效的索引和搜索。但数据库也有同质数据阵列存储一样的缺点。

3、结构化自定义存储是企业文档存储最好的选择,它的主要优点是允许向现有存储高效地添加或删除文档或文档中的部分内容,同时能够提供高效的文档访问限制,复杂文档(包括嵌入的图像或其它多媒体数据)可以通过其包含的文本内容进行简单的处理,这样将会减少载入/保存时间,让文本搜索变得更简单,与此同时,在发生故障后日志可以保证其可恢复(完全或部分恢复)。还有一个好处是可以在文档内存储多个版本,其缺点是搜索速度很慢,运行时应该转换成明文,这样才能提高检索效率。

4、zip文件使用某些文件格式,如开放文档格式存储文档数据,但修改和删除信息将非常耗时,有时甚至需要完全重写文件,同时,zip文件格式不允许你在其中添加元数据,zip加密功能有限的(最近在标准中加入了强AES加密,但许多zip压缩和解压工具尚不支持它)。

5、远程和分布式存储日益普及和流行,在文档创建和使用时更易于协作,其缺点和前面几个一样。

建议的解决方案

在软件设计领域,选择正确的工具非常重要,但不正确的数据存储规划可能会导致灾难性后果。

1、使用文件时,你要面对的是文件系统的选择。

2、使用数据库时,有很多的商业数据库可选择,Oracle,DB2等,也有开源的解决方案可供选择。

3、存储仓库可以由商业或公共归档解决方案创建,如zip等。

4、结构化存储的例子包括微软的OLE结构化存储(提供基本的存储功能,无加密,压缩和搜索功能),EldoS提供的Solid文件系统等。

5、EldoS的Solid文件系统和Callback文件系统,以及基于Unix系统的FUSE,可以提供远程存储。

在任何情况下,只有项目开发人员知道准确的需求和了解所有需要的技术,以及它们的功能和限制,因此他们可以为软件项目的成功实施选择正确的工具。