有说凡所有相皆是虚幻,此说所有相皆是数据,有人的地方就有江湖,有数据的地方就有关系
Discuz从小小的论坛现在发展成一个庞大的门户系统,程序结构越发复杂庞大。数据库操作也从简单的CRUD变得日益复杂的关系查询。数据之间的关系变得越来越紧密,越来越复杂,此时功能的添加,架构的改动,数据库结构产生的影响也越发重要。如果项目主管,开发人员没有一定的数据库知识,没有对“数据”的一定了解,那么设计出来的东西要么不符合逻辑,要么不实用。
第一品:帖无所住,何生其心
discuz X2.5在设计上一个大变化是对于主题中跟帖被删除后其所占用楼层并不消失后续楼层并不自动变化楼层数值让楼层数字连续,而是跟帖内容显示成“无效楼层,该帖已经被删除”。
我估计此设计初衷是解决以前设计中删除跟帖后产生的一系列关联问题,假如删除了5楼回帖,那么删除前的6楼在5楼帖子删除后将会显示成5楼,其后所有跟帖的楼层也跟着减小一位。若后面有跟帖是引用5楼发布那么帖子中指向(原)5楼的url链接将会变得无效。dz开发人员觉得要解决这个逻辑问题,于是就在2.5上面实现了帖子删除保留楼层的功能。并且这个功能还可以与2.5另外一个新设计
post表的优化 问题:
高楼贴的性能问题 limit 187460, 20 方法:
增加position字段记录楼层,修改主键为:PRIMARY KEY (tid, `position`)联合主键,其中position为auto_increment;
pid字段保留,仍然是auto_increment(单独的一个表),保持唯一,其值在一个单独的表中记录,保留此字段的主要目的是可以让原程序的基本不用做修改;
使用方法:
SELECT * FROM pre_forum_post WHERE tid=424 AND position>=$start AND position<$end ORDER BY position;
抢楼贴和普通的盖楼贴机制统一;
搭配得天衣无缝。
可是,如果一个技术不符合实际那么无论它再怎么先进也是不适用的。借用某位网友对这个功能的截图:
无论你是论坛管理员还是会员,当你打开一个主题满屏都是“无效楼层,该帖已被删除”的提示,甚至翻过几页每页都是如此,你作何感想?
帖子既已被删除,过去的就过去了。固执己身不是法,你偏偏要为其强留印迹,虽然能让以后的恩怨能找到个节点,但这也是个结点,纠结的结——已经不存在的东西怎么能解决以后的问题呢,即便从以后跟帖的超链中找到这儿又能了解到什么呢?
无尽空虚带来的往往不是美好的回忆而是无尽的烦恼。
抽刀断水水更流,开发人员试图用一个无效楼层来解决一系列逻辑的,性能的问题。可适得其反。本该往生极乐的跟帖活生生被了留个尾巴在原地。无余涅槃不得,自然纠结其心,此无住,无中生有,生得观者烦心,管理者闹心,作者窝心……
帖有生灭,心无增减。去了的就让它去了吧,留下的即便也有丝丝藕连,也是有情众生之牵挂,为了忘却的纪念
|