ipcd 原子树设计
时间:2006-12-28
来源:互联网
本人文笔很差,希望你能有忍耐力看完这个帖子.
我设计了一个框架系统,
我把他命名为:ipcd 原子树 模型
因为是一个月前我才凭空想到的这个系统设计方法,正好公司有个项目要上线,所以比较匆忙。
我先不说这样命名的原因。
我把我设计里的几个重要的东西列出来大家先看看,有兴趣的话,
我继续介绍(不过,只能说理论,不能贴代码,因为我是为公司做的,不过对于各位高手来说,只要提出理论,实现不是什么难的事情)
1.数据库的结构:
设计目标:这样设计的意义我就不费口舌了。
1.数据关系结构和业务分离
2.数据存储和数据关系结构分离
实现:
有两个特殊的表
atom表:这样命名的原因是.我们做程序的常常用原子这个词来表示唯一的,不可分的设计。我这个
设计正好符合这个习惯。
tree表:目的就是存储数据(业务)关系的。
还有N个用来存储数据的表.
闲话少说。给出结构大家看看,就明白了:
tree表:存储节点关系树
字段:id pid cid dat datin fun
类型:bigint bigint int varchr varchr varchr
解释:
节点的含义:就是我们常规设计中的字段了
id: 数据(业务)关系中的节点的唯一数字标识
pid:数据(业务)关系中的节点的上级(父节点)的唯一数字标识
cid:目前和id同含义,
dat:节点的名称
datin:节点的数据存储在那个表中,当然极端情况可以每个节点一个表
fun:对于节点数据的限制和预处理定义,我的设计里采用json的定义方式定义
看下面的数据就明白这几个的关系了
数据:拿dv.weila.cn的设计来说
id pid cid dat datin fun
20 0 20 虚拟的根节点 tree {}
40 20 40 用户_用户名 username_s32 {"NOTNULL":"1","NOTEDIT":"1","UNCD":"1"}
60 40 60 作品_作品名 dat_zpm_s32 {"NOTNULL":"1","UNPD":"1"}
80 40 80 用户_密码 userpw_s32 {"NOTNULL":"1","MD5":"1","UNPC":"1"}
120 40 120用户_密保_提示问题 dat_s32 {"NOTNULL":"1","NOTEDIT":"1","UNPC":"1"} 140 40 140 用户_密保_答案 userpw_s32 {"NOTNULL":"1","NOTEDIT":"1","MD5":"1","UNPC":"1"}
760 60 760 作品_总分 dat_i32 {"MIN":"1","MAX":"10","DEFVAL":"0","NOTNULL":"1","UNPC":"1"}
就列出这么多吧。
很明显的是id,pid组成了节点间的父子,兄弟关系,我成之为关系树,这也就是tree的由来
fun 是对具体数据的限制和处理了,比如:
NOTNULL:数据不允许为空
NOTEDIT:数据不允许更改
DEFVAL:数据建立的时候默认值是什么
MIN/MAX:数据允许的最小/大值
MD5:数据要存储前要进行MD5编码
UNxxx的解释:
首先,UN是表示唯一的/不同的意思
P 对应的就是pid
C 对应的就是cid(就是tree里的id 或cid)
D 对应的就是tree 表里datin 字段定义的表里的dat字段一会你就看到了
这几项组合起来就是
UND:同一个表里数据(dat)要唯一
UNPD:同一个表里相同pid 的数据(dat)不能重复
UNPC:同一个表里相同pid 的数据的cid不能重复
UNCD:同一个表里相同cid的数据(dat)不能重复
UNPCD:同一个表里相同pid,cid的数据(dat)不能重复
按照这样的逻辑就对数据提出了具体的要求,因为这些要求都是常见的,所以你可以把常见的要求写成
标准库,当然特殊的逻辑就要单独写了。
atom表:对所有的数据进行id,pid,cid的记录
字段:id pid cid dat
类型:bigint bigint int timestamp
解释:
id: 数据的唯一标识
pid:数据的父数据的唯一标识
cid:数据的节点id 就是 tree 表中的 id/cid
dat:这个本来在atom表中不是必须的,但我用他来存储数据建立的时间
数据举例:这个atom 表的dat 就不写了
id pid cid 数据举例的解释
1001 0 40 有一个cid=40(用户_用户名)的数据唯一id是1001,父id是0(根,可解释为没有父亲)
1002 1001 60 有一个cid=60(作品_作品名)的数据唯一id是1002,父id是1001
1003 1001 80 有一个cid=80(用户_密码)的数据唯一id是1003,父id是1001
........
username_s32表:首先多了一个lasttime字段表示数据最后更改的时间当然不是必须的
各个字段的类型就不写了,id,pid,cid都一样,dat根据业务的不同大家各自定义吧
id pid cid dat lasttime
1001 0 40 achun xxxxx
................
dat_zpm_s32表:
id pid cid dat lasttime
1002 1001 60 自拍生活短片 xxxxx
..........
userpw_s32表:
id pid cid dat lasttime
1003 1001 80 0afcd74958... xxxxx
..................
大家看到这里应该明白了:
哈,就是用数据库存储的一个数据关系的链表.
不过把这些数据联系起来就形成了一棵树--数据的树:原子树
其实这棵树看起来更像DOM模型,或者说,xml定义的方式..如果你按这种设计做项目的话,你就明白我说什么了。
好了总节一下:
就是用数据库把我们在学校里学的数据结构里的链表存储起来,链表是数据的通用描述方法
所以这种设计在理论上应该可以表现链表能表示的数据关系,其实也就是绝大多数的业务关系了。
今天打的手都累了,先说这么多,大家感兴趣的话我再接着说。
最后说一句:当然这样的设计在实际应用中不是万能的(因为还在摸索中么),对服务器的压力也是常规设计的
N倍,不过这不是问题,硬件在不停发展么。还有就是如果按这中设计从底层上改造数据库的设计那就另当别论了。
作者: achun.shx 发布时间: 2006-12-27
作者: cator 发布时间: 2006-12-27
作者: joknang 发布时间: 2006-12-28
php里面的序列化直接序列数组 或者对象。然后存贮到一个字段里面。
哪个来的快点? 你这样还要查询数据库,提取出关系,然后再还原,费事。
作者: flappy 发布时间: 2006-12-28
作者: thankwsx 发布时间: 2006-12-28
引用:
原帖由 flappy 于 2006-12-28 10:18 发表有必要吗?
php里面的序列化直接序列数组 或者对象。然后存贮到一个字段里面。
哪个来的快点? 你这样还要查询数据库,提取出关系,然后再还原,费事。
作者: achun.shx 发布时间: 2006-12-29
作者: borisauschina 发布时间: 2007-01-25
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28