日期:2014-05-16  浏览次数:20467 次

换一种思路,循环插入数据库是否必要?
今天BOSS要我对网站所有的会员发一条消息,原来的系统是通过后台对每个会员发【每次只能选择一个或者多个,但不能选择全部】,前台根据消息表message_info里的user_id字段查询出对应该会员的消息。

本系统采用SSH+MYSQL
message_info数据结构如下
--------------  -------------------------------  -------
ID            bigint(20)       
TITLE         varchar(255)
CONTENT       text         
USER_ID       bigint(20)                   
PUBER_ID      bigint(20)               
CREATED_TIME  datetime  

前台查询语句如下:[这是翻译后的SQL,本是HQL]
select * from message_info where userId=${user.id} order by id desc

思路一:“写一个循环插入语句,在数据库里运行”
    由于我对MYSQL不是很熟,所以我花了1个小时去研究该怎样写SQL,但最终还是放弃了。大概思路就是建立一个存储过程然后里面加一个循环。

思路二:“在程序中for循环Insert语句”
    这个实现起来相对简单一些,不过需要改代码,服务器需要重启。

吃过饭后,坐在电脑前休息了一会,突然想到,网站现在只有上千的会员,但要是以后上万甚至上十万难道 还要继续这样循环插入么?一个是速度慢,影响服务器性能甚至可能直接导致服务器崩溃。第二个,这么多数据插到数据库里,有什么坏处地球人都应该知道吧。
于是我马上想到从SQL语句下手,方案如下:
SQL语句更改为:
select * from message_info where userId=${user.id} or userId=0 order by id desc

//userId=0用于表示所有userId,id是标识列,这里的0也可以用其他负数代替

插入语句:
INSERT INTO message_info
(title,content,user_id,puber_id,created_time)
VALUES('测试所有',
'三大随碟附送大时代<br><br>更多详情请点击<A target=_blank href=http://www.wibowibo.com/space.do?m=index&id=10>http://www.wibowibo.com/space.do?m=index&id=10</a> ',
0,
1,
now())

这样我只更改了前台的HQL【由于使用了自定义标签,所以服务器不需要重启】,数据库里只插入了一条信息,这样就解决BOSS交给我的问题,而不用再去写什么循环插入语句了~


总结:在我们编写循环插入语句的时候,最好先问一下自己,这样做是不是必要的?这样做是不是最适合的?作为程序员,实现一个功能有很多种方式,也许没有最好的方式,但一定有一个是最适合的,“退一步,海阔天空”。
程序员是脑力劳动者,所以当你在不断的重复同样的工作时,你就该想想,有什么方法可以替代这些无聊的步骤,作为程序员,就应该让自己变得“懒”点。

第一次写东东,表达能力有限,欢迎高手指点。