Discuz!官方免费开源建站系统

 找回密码
 立即注册
搜索

赞叹康盛的数据库设计的好

[复制链接]
kumotobi 发表于 2012-8-22 00:49:00 | 显示全部楼层
mark35 发表于 2012-8-21 21:34
附件表既然都分表了为何不再分一个临时附件表用于保存新上传附件呢。
比如未提交新主题的附件,此时 ...

mark35 哥,帮我看下这个解决 https://discuz.dismall.com/thread-3022687-1-1.html:$
回复

使用道具 举报

 楼主| 圆圆舟子 发表于 2012-8-22 10:58:14 | 显示全部楼层
本帖最后由 圆圆舟子 于 2012-8-22 12:31 编辑
mark35 发表于 2012-8-21 21:34
附件表既然都分表了为何不再分一个临时附件表用于保存新上传附件呢。
比如未提交新主题的附件,此时ti ...


从mark35学到很多呢,牛人{:soso_e179:}



1)我看到数据库有forum_attachment_0, forum_attachment_1.... 这种表。   

让forum_attachment 包含 forum_attachment_0,1,2.... (到9)想要描述的,就能合并这11个表,对吧?

康盛团队,是不是要特意用这10个“小”表来缓存比较细节的讯息(避免同时读取 forum_attachment )?{:soso_e132:}

2)另外已经有attachment_unused 的表了耶。我用的是X2.5,不知道其他版本的是如何了。

3)forum_attachment这表的tableid,好像多余了,和tid重复了,用tid就行了吧。 我新的database就不灌tableid了看看有没有bug



ATTACHMESS01.jpg
ATTACHMESS.jpg
回复

使用道具 举报

小森我爱你 发表于 2012-8-22 12:49:34 | 显示全部楼层
就是个垃圾,看楼上俩位的回答,还好呢,垃圾就是垃圾。
回复

使用道具 举报

mark35 发表于 2012-8-22 14:07:54 | 显示全部楼层
本帖最后由 mark35 于 2012-8-22 23:14 编辑
圆圆舟子 发表于 2012-8-22 10:58
从mark35学到很多呢,牛人

forum_attachment是附件索引表,forum_attachment_{0,9} 是附件分表。索引表用tableid来标注每个附件记录所在分表位置。这种设计繁琐。
相关函数如下:

  1. function getattachtableid($tid) {
  2.     $tid = (string)$tid;
  3.     return intval($tid{strlen($tid)-1});
  4. }

  5. function getattachtablebytid($tid) {
  6.     return 'forum_attachment_'.getattachtableid($tid);
  7. }

  8. function getattachtablebypid($pid) {
  9.     $tableid = DB::result_first("SELECT tableid FROM ".DB::table('forum_attachment')." WHERE pid='$pid' LIMIT 1");
  10.     return 'forum_attachment_'.($tableid >= 0 && $tableid < 10 ? intval($tableid) : 'unused');
  11. }
复制代码
附件分表是用tid值取余而成,所以是0-9范围。如果是用tid来取aid(比如浏览主题内容)则直接可使用前两个函数从tid值获得分表名字。
而第三个函数是从pid获得分表名称,这就需要用到 pre_attachement 索引表中tableid字段了。
其实一个关联查询就可以从pid获得tid再运算出分表名,为啥还要整这么复杂,在附件索引表加字段配合函数来解决呢? 还是那个原因:mysql不适合作关联查询,更无法承受复杂查询。如果按照数据库规范设计表结构,那么dz的表数量会减少,表冗余字段(比如username/author)会减少很多,表结构会清晰许多,PHP程序代码会简洁很多。

所以楼上有人说dz垃圾,其实并不是dz的问题,discuz是很优秀的论坛程序,而是选择了个垃圾的mysql,使得整个系统构架,程序逻辑,程序代码不得不围绕数据库功能来设计受其制约。最后搞得数据库表多,表结构复杂,程序代码复杂



回复

使用道具 举报

mark35 发表于 2012-8-22 14:09:38 | 显示全部楼层
本帖最后由 mark35 于 2012-8-22 14:39 编辑

另外,dz开发人员喜欢使用

  1. $tid{strlen($tid)-1}
复制代码
花括号代替方括号来取字节值,这种做法现在已经被PHP所不推荐。

另外2
return 'forum_attachment_'. ($tableid >= 0 && $tableid < 10 ? intval($tableid) : 'unused');

看来合理,但其实在表字段上加个CHECK约束即可,插入更新时检查,何需每次读取时判断
  1. return 'forum_attachment_'. ($tableid == -1 ? 'unused' : $tableid);
复制代码
以-1表示unused
回复

使用道具 举报

 楼主| 圆圆舟子 发表于 2012-8-22 18:37:02 | 显示全部楼层
原来如此啊 {:soso_e179:}
回复

使用道具 举报

guoysbest 发表于 2012-8-22 20:59:44 | 显示全部楼层
奶奶的 都是高手啊 MARK35
回复

使用道具 举报

Monkey威武 发表于 2012-8-22 21:00:24 | 显示全部楼层
sw08 发表于 2012-8-21 20:18
不过说实话,DZ的很多数据表连最基本的1NF都不能满足。
那个坑爹的勋章和论坛版主字段就是,修改操作特别 ...

附件表容易导致多余数据而且不容易清理?
回复

使用道具 举报

Monkey威武 发表于 2012-8-22 21:01:16 | 显示全部楼层
mark35 发表于 2012-8-21 21:34
附件表既然都分表了为何不再分一个临时附件表用于保存新上传附件呢。
比如未提交新主题的附件,此时ti ...

呵呵,干脆设计一个叫pre_forum_attachtemp的表。存放临时附件
回复

使用道具 举报

Monkey威武 发表于 2012-8-22 21:03:41 | 显示全部楼层
mark35 发表于 2012-8-22 14:07
forum_attachment是附件索引表,forum_attachment_{0,9} 是附件分表。索引表用tableid来标注每个附件记录 ...

数据库体积越来越大,出故障的几率也大了。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2025-9-10 17:17 , Processed in 0.115581 second(s), 16 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表