zoukankan      html  css  js  c++  java
  • 特殊格式文件(视频、声音等) 在数据库中的存储方式

    问题描述:一般网站,对于用户上传的图片、视频、声音等特殊格式的数据是以本地文件的形式存储,然后把相应URL路径存放在数据库里呢;还是,将数据直接写到数据库里存放?

            答:多数网站,基本上采用的是第一种方式,即:文件存储+URL路径的模式。

            首先,视频、声音、图片为非结构化数据,传统的关系型数据库主要是是针对结构化数据设计的,虽然有相应的字段格式支持存储,即:如果要把视频等文件存储到数据库的话,要使用大字段(例如:Oracle,Mysql中的BLOB特殊二进制字段),但性能表现不佳。当然也可以采用非结构化的NoSQL数据库,但是现有的NoSQL数据的存储单元仍是针对小块存储设计的,也就是说,当面对较大的视频格式等文件时,还是会有性能问题。

            数据库里可以直接写入上述特殊数据,但这种存储方式对于用户请求过程有明显的缺点,占内存、速度慢、效率不高,会耗费较大的数据库资源;因为用户每次请求数据的时候,需要先访问数据库,从数据库中查询到相关文件,然后将文件以数据流的方式读到数据库内存,最后返回给用户,这时就需要你的系统要有较大的内存,比较快的读取速度,另外还会一定程度上影响数据库的一些查询性能。比如:数据库表中如果添加用于存放视频格式的二进制字段后,即使相应的二进制字段为NULL,查询的时候不查询该二进制字段,查询速度仍然会下降很多,这种情况下想通过优化SQL语句提高性能,收效胜微。

          说了这么多,是不是选择 直接存在数据库就一定不好呢,其实不然!

          将视频、图片等格式的数据存放在数据库的话,也有一定的好处,比如:

    1. 比较容易去重,可以将多余重复的数据利用SQL语句过滤删除,操作方便

    2. 备份的时候,使用数据库的备份方式简单。(当然这也是相对的,数据的存储越大,恢复越麻烦。)

          3. 相较与原生存储 更加安全(增加了数据库的一层保护)

           那么,什么样的业务场景适合直接存放在数据库中?

           如果是一个小型的网站,像论坛等,平时用户上传、请求的该类特殊数据比较少,而又注重上述这种方式的优点的话,可以采用。

    总结

            大多数情况下,如果要存储图片、文件、视频等大文件对象,建议存成本地文件(提高性能的话采用分布式存储),不建议直接存储到数据库中;对于目前主流的视频网站,如何存放视频文件呢?可以参考知乎的一篇文章。

    附:Mysql数据库中存入视频格式文件测试

    创建一个测试表test,使用longblob或者mediumblob

    CREATE TABLE test (id  INTEGER NOT NULL PRIMARY KEY,name VARCHAR (20),movie  LONGBLOB);

    然后把视频文件导入

    INSERT INTO test  VALUES(1, 'titanic', LOAD_FILE("/tmp/good.mp4"));

    注意,如果不使用longblob可能出现以下错误

  • 相关阅读:
    JavaSE:和网络相关的协议
    随机产生四位,任意位或者范围数字方法
    随机产生四位,任意位或者范围数字方法
    如何保留小数精度
    如何保留小数精度
    JDK开发环境搭建及环境变量配置详细教程
    JDK开发环境搭建及环境变量配置详细教程
    排序算法
    html中a标签如何设置行宽高
    MyEclipse10破解详细说明
  • 原文地址:https://www.cnblogs.com/hellojesson/p/6295797.html
Copyright © 2011-2022 走看看