文档章节

数据库与图片完美解决方案

netkiller-
 netkiller-
发布于 2013/05/15 21:58
字数 1308
阅读 113
收藏 2

数据库与图片完美解决方案

电商商品图品与数据库脏数据完美解决方案

MrNeo Chen (netkiller)陈景峰(BG7NYT)


中国广东省深圳市龙华新区民治街道溪山美地
518131
+86 13113668890
+86 755 29812080
<netkiller@msn.com>

$Id: mysql-dev.xml 586 2013-05-15 13:53:23Z netkiller $

版权 © 2011, 2012, 2013 http://netkiller.github.com

$Date: 2013-05-15 21:53:23 +0800 (Wed, 15 May 2013) $

摘要

你是是不是在开发中常常遇到,删除了数据库记录后,发现该记录对应的图片没有删除,或者删除了图片,数据库中仍有数据存在,你的网站脏数据(图片)成几何数增长,阅读下文这里为你提供了一个完美决方案。

1. 背景

我以电商网站为例,一般的网站产品数据存放在数据库中,商品图片是上传到文件服务器,然后通过http服务器浏览商品图片。这是最基本的也是最常见做法。

稍复杂的方案是,如果图片数量庞大,会使用分布式文件系统方案。但是这些方案都不能保证数据的完整性,极易产生脏数据(垃圾数据)。脏数据是指当你删除了数据库表中的记录后,图片仍然存在,或者手工删除了图片,而数据库中的记录仍然存在。

将图片放入数据库中存放在BLOB的方法可以解决脏数据问题,典型的案例是公安的身份证系统。但这种方案的前提是,图片不能太大,数量不多,访问量不大。 这显然不适合电商网站。

2009年我在走秀网工作,商品图片与缩图文件900GB到2012离职已经有10TB,每天有成百上千的商品上架下架,很多商品下架后永远不会再上架,这些批量下架的商品数据不会删除,仅仅标记为删除,总是期望以后能继续使用,实际上再也不会有人过问,另一方面随着品类经理频繁更换,员工离职,这些商品会石沉大海,再也无人问均。这些商品所对应的图片也就脏数据主要来源。新的品类经历上任后,会重新拍照,上传新图片。

总之,删除数据库中的数据不能将图片删除就会产生脏数据。很多采用删除数据的时候去检查图片如果存在先删除图片,再删除数据的方法。这种方案也非完美解决方案,存在这图片先被删除,程序出错SQL没有运行,或者反之。

2. 解决思路

如果删除图片能够成为事物处理中的一个环节,所有问题都能迎刃而解,可彻底解决脏数据的烦恼。

3. 解决方案

mysql plugin 开发 udf。我写了三个function

UDF

image_check(filename)

检查图片是否存在.

image_remove(filename)

删除图片.

image_rename(oldfile,newfile)

更改图片文件名.

image_md5sum(filename)

md5sum 主要用户图片是否被更改过.

有了上面的function后你就可以在begin,commit,rollback 直接穿插使用,实现在事物处理期间做你爱做的事。

通过触发器更能保证数据完整性

1. insert 触发器的任务: 插入记录的时候通过image_check检查图片是否正常上传,如果非没有上传,数据插入失败。
2. delete 触发器的任务: 检查删除记录的时候,首先去删除图片,删除成功再删除该记录。

触发器进一步优化

1. insert 触发器的任务: 插入记录的时候通过image_check检查图片是否正常上传,如果非没有上传,数据插入失败。如果上传成功再做image_md5sum 进行校验100% 正确后插入记录
2. delete 触发器的任务: 检查删除记录的时候,首先去改图片文件名,然后删除该记录,最后删除图片,删除成功。如果中间环境失败 记录会rollback,图片会在次修改文件名改回来。100% 保险

4. plugin 的开发与使用

开发UDF你需要安装下面的软件包

sudo apt-get install pkg-config
sudo apt-get install libmysqlclient-dev

sudo apt-get install gcc gcc-c++ make automake autoconf

编译udf,最后将so文件复制到 /usr/lib/mysql/plugin/

./configure --prefix=/srv/mysql --with-mysql=/usr/bin/mysql_config

装载

create function image_check returns boolean soname 'images.so';
create function image_remove returns boolean soname 'images.so';
create function image_rename returns boolean soname 'images.so';
create function image_md5sum returns string soname 'images.so';

卸载

drop function image_check;
drop function image_remove;
drop function image_rename;
drop function image_md5sum;

© 著作权归作者所有

netkiller-

netkiller-

粉丝 706
博文 274
码字总数 383156
作品 10
深圳
部门经理
私信 提问
加载中

评论(2)

netkiller-
netkiller- 博主

引用来自“jrchens”的评论

业务实体(table[1~N]) deleted=1
附件路径(table1) deleted=1
目标文件

task+timer
应该也可以解决了啊.
不明白在说什么:)
我的名子
我的名子
业务实体(table[1~N]) deleted=1
附件路径(table1) deleted=1
目标文件

task+timer
应该也可以解决了啊.
数据库与图片完美解决方案

数据库与图片完美解决方案 电商商品图品与数据库脏数据完美解决方案 Mr. Neo Chen (netkiller), 陈景峰(BG7NYT) 中国广东省深圳市龙华新区民治街道溪山美地 518131 +86 13113668890 +86 755...

netkiller-
2014/05/21
698
7
AnyGantt Flash甘特图组件

AnyGantt是一个强大的,基于Flash的数据可视化解决方案。允许任何人利用有力的动画和最终的可交互性。 AnyGantt是构建复杂和翔实的甘特图的理想工具。原文来自龙博方案网http://www.fangan...

javascript1
2014/06/09
391
0
网站内容管理系统--PHPCMS

Phpcms2008 是一款基于 PHP+Mysql 架构的网站内容管理系统,也是一个开源的 PHP 开发平台。Phpcms 采用模块化方式开发,功能易用便于扩展,可面向大中型站点提供重量级网站建设解决方案。3年...

大鹏rocing
2009/01/13
13.5K
0
帆软商业智能FineBI 4.0今日正式发布

2016年7月27日,帆软官方(www.finebi.com)对外宣称,将正式发布商业智能FineBI 4.0。 这次的新版发布,背后是帆软BI团队对产品孜孜不倦的钻研打磨,力争诠释FineBI在商业智能数据分析领域的...

玄学酱
2018/05/21
0
0
人生不能纠结

一直困扰我的迷,今天有了小小的触动。我感觉很开心! 迷是这样的。一直以来,我很早起床,很晚睡觉,但进步并不是很大。有事甚至对自己产生怀疑,以为自己大脑退化,有点老年痴呆了。 昨天晚...

hunter007
2015/01/11
208
2

没有更多内容

加载失败,请刷新页面

加载更多

009、Linux 文件权限管理

Linux 文件权限管理

北岩
27分钟前
5
0
Kafka学习笔记(三)—Kafka消息丢失,消费重复

一、数据传输事务的定义 最多一次(at most once):消息不会被重复发送,但是可能丢失 最少一次 (at least once)消息可能会被重复发送,但是不会漏发送 精确一次(exactly once) 不会少发...

Algoric
31分钟前
5
0
ajax设置请求头部时遇到的问题

w3c规定 当请求的header包含以下字段时 会被zhong'zhi Accept-Charset Accept-Encoding Connection Content-Length Cookie Cookie2 Content-Transfer-Encoding Date Expect Host Keep-Alive......

Bing309
55分钟前
5
0
总结:Linux

一、目录 目录 作用 /bin 存放二进制可执行文件(ls,cat,mkdir等),常用命令一般都在这里。 /etc /home 存放所有用户文件的根目录,是用户主目录的基点,比如用户user的主目录就是/home/user,...

浮躁的码农
58分钟前
4
0
什么是 happens-before 原则?

Java 中 happens-before 原则,是在 JSR-133 中提出的。 原文摘要: • Each action in a thread happens-before every subsequent action in that thread. • An unlock on a monitor happe......

ConstXiong
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部