三种东西永远不要放到数据库里

改进你的系统的最好的方法是先避免做“蠢事”。 我并不是说你或你开发的东西“蠢”,只是有些决定很容易被人们忽略掉其暗含的牵连, 认识不到这样做对系统维护尤其是系统升级带来多大的麻烦。

作为一个顾问,像这样的事情我到处都能见到,我还从来没有见过做出这样的决定的人有过好的结果的。

图片,文件,二进制数据

既然数据库支持BLOB类型的数据,把文件塞进BLOB字段里一定没有错了!?错,不是这样的! 别的先不提,在很多数据库语言里,处理大字段都不是很容易。

把文件存放在数据库里有很多问题:

  • 对数据库的读/写的速度永远都赶不上文件系统处理的速度
  • 数据库备份变的巨大,越来越耗时间
  • 对文件的访问需要穿越你的应用层和数据库层

这后两个是真正的杀手。

把图片缩略图存到数据库里?很好,那你就不能使用nginx或其它类型的轻量级服务器来处理它们了。

给自己行个方便吧,在数据库里只简单的存放一个磁盘上你的文件的相对路径,或者使用S3或CDN之类的服务。

短生命期数据

使用情况统计数据,测量数据,GPS定位数据,session数据,任何只是短时间内对你有用,或经常变化的数据。 如果你发现自己正在使用定时任务从某个表里删除有效期只有一小时,一天或数周的数据, 那说明你没有找对正确的做事情的方法。 使用redis,statsd/graphite,
Riak,它们都是干这种事情更合适的工具。 这建议也适用于对于收集那些短生命期的数据。

当然,用挖土机在后花园里种土豆也是可行的,但相比起从储物间里拿出一把铲子, 你预约一台挖土机、等它赶到你的园子里挖坑,这显然更慢。 你要选择合适的工具来处理手头上的事。

日志文件

把日志数据存放到数据库里,表面上看起来似乎不错,而且“将来也许我需要对这些数据进行复杂的查询”, 这样的话很得人心。这样做并不是一个特别差的做法, 但如果你把日志数据和你的产品数据存放到一个数据库里就非常不好了。

也许你的日志记录做的很保守,每次web请求只产生一条日志。 对于整个网站的每个事件来说,这仍然会产生大量的数据库插入操作, 争夺你用户需要的数据库资源。 如果你的日志级别设置为verbose或debug,那等着看你的数据库着火吧。

你应该使用一些比如Splunk Loggly或纯文本文件来存放你的日志数据。 这样去查看它们也许会不方便,但这样的时候不多,甚至有时候你需要写出一些代码来分析出你想要的答案, 但总的来说是值得的。

可是稍等一下,你是那片不一样的雪花,你遇到的问题会如此的不同, 所以,如果你把上面提到的三种东西中的某一种放到了数据库里也不会有问题。 不,你错了,不,你不特殊。相信我。

时间: 2024-08-07 04:00:25

三种东西永远不要放到数据库里的相关文章

三种东西永远不要放到mysql数据库里_Mysql

图片,文件,二进制数据永远不要放到mysql数据库里. 很多人会觉得既然数据库支持BLOB类型的数据,把文件塞进BLOB字段里一定没有错了!?错,不是这样的! 别的先不提,在很多数据库语言里,处理大字段都不是很容易.把文件存放在数据库里有很多问题: 1.对数据库的读/写的速度永远都赶不上文件系统处理的速度2.数据库备份变的巨大,越来越耗时间3.对文件的访问需要穿越你的应用层和数据库层这后两个是真正的杀手.那么把图片缩略图存到数据库里?结果是,你不能使用nginx或其它类型的轻量级服务器来处理它们

大数据挖掘中的三种角色

我对数据挖掘和机器学习是新手,从去年7月份在Amazon才开始接触,而且还是因为工作需要被动接触的,以前都没有接触过,做的是需求预测机器学习相关的.后来,到了淘宝后,自己凭兴趣主动地做了几个月的和用户地址相关数据挖掘上的工作,有一些浅薄的心得.不管怎么样,欢迎指教和讨论. 另外,注明一下,这篇文章的标题模仿了一个美剧<权力的游戏:冰与火之歌>.在数据的世界里,我们看到了很多很牛,很强大也很有趣的案例.但是,数据就像一个王座一样,像征着一种权力和征服,但登上去的路途一样令人胆颤. 大数据挖掘中的

动态改变EnterpriseLibary数据库访问链接字符串的三种方法

使用EnterpriseLibary做数据库访问底层是我一贯的做法,除了其能兼容多种数据库,且使用其进行数据库访问,对各种数据库操作均是透明的,基本不需要对特定的数据库进行操作,编写一次操作代码,基本在各种数据库都适用.对于一些特殊的数据库,很多同行已经编写出各种各样的扩展类库,直接适用即可. 言归正传,动态改变EnterpriseLibary数据库访问链接字符串一般在使用Access数据库.Sqlite数据库等文件式的数据库比较常见,因为我们不知道客户会把程序拷贝到哪里进行使用(即使是做了安装

android sqlite使用之模糊查询数据库数据的三种方式

android应用开发中常常需要记录一下数据,而在查询的时候如何实现模糊查询呢?很少有文章来做这样的介绍,所以这里简单的介绍下三种sqlite的模糊查询方式,直接上代码把: package com.example.utils; import java.util.ArrayList; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import

java中三种主流数据库数据库(sqlserver,db2,oracle)的jdbc连接总结

原文http://www.cnblogs.com/PatrickChen/archive/2008/12/08/1350395.html 其实java开发中连接数据库的主要问题不是如何写代码,而是找驱动包.因为jdbc的驱动包太多,并且名目繁多,有的还需要安装客户端才能运行. 项目实践中,总结出三种主流数据库中,Java的驱动和连接字符串,均无需安装客户端: 一.             Sqlserver: 驱动包:sqljdbc.jar 实例: String _driverName = "c

c# winform...-vs 2015用c#把当前时间放到连接的sql数据库里

问题描述 vs 2015用c#把当前时间放到连接的sql数据库里 如题,我用的是string now=DateTime.Now.ToShortDateString(),然后再把这个now更新到数据库里一个表里面的字段里,这个字段是datetime类型的,执行完成查看数据库里,显示却是1900-01-01,就是和当前时间不对,求大神讲解,谢谢了. 解决方案 首先你先看看你的now获取的对不对,其次你获取的now是字符串类型的,往数据库存成datetime人家不识别,所以给你个默认值,转成date类

.net-如何把数据库里的东西绑定到页面,然后选择页数打开。

问题描述 如何把数据库里的东西绑定到页面,然后选择页数打开. 求助,用dropdownlist设置页数,页面需要加什么控件吗,如何实现?? 解决方案 分页最好使用存储过程进行分页,速度快.有现成的分页存储过程可以使用.http://www.cnblogs.com/vagerent/archive/2007/10/17/927825.html 显示的时候,存储过程返回总页数的,给dropdownlist绑定一下就可以. 解决方案二: http://blog.sina.com.cn/s/blog_4

怎么样把从数据库里读出来的图片二进制流,放到image里显示?

问题描述 winform项目怎么样把从数据库里读出来的图片二进制流,放到image里显示? 解决方案 解决方案二:各位大虾救命啊解决方案三:System.Drawing.Imageimage=newSystem.Drawing.Bitmap(流,true);就可以阿.解决方案四:byte[]bts=this.getdbBytes();MemoryStreamms=newMemoryStream(bts);Imageimg=Image.FromStream(ms); 解决方案五:那怎么从数据库里读

OpenStack里的三种存储

OpenStack其实有三个与存储相关的组件,这三个组件被人熟知的程度和组件本身出现时间的早晚是相符的,按熟悉程度排列如下: Swift--提供对象存储 (Object Storage),在概念上类似于Amazon S3服务,不过swift具有很强的扩展性.冗余和持久性,也兼容S3 API Glance--提供虚机镜像(Image)存储和管理,包括了很多与Amazon AMI catalog相似的功能.(Glance的后台数据从最初的实践来看是存放在Swift的). Cinder--提供块存储(