精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2011-10-08
最后修改:2011-10-08
今天来说说数据库的设计,现在一般用hibernate维护关系.首先探讨一个问题,一个系统的id是不是只用一种?或者String类型的uuid,或者其他的?如果全部用uuid的话,那么开发也会很方便,到哪里都操作的是String类型的,Action层也是String类型的,整个统一的好处不言而喻.但是,如果系统数据量很大的话,uuid其实是很费空间的,以前听说,在Oracle界不用uuid的话会被鄙视不专业,但是经过我这个系统的实践开发,加上在公司研究了其他的项目,最后总结出来:一个系统的id可以有多种,刚开始时我也接受不了这种开发,觉得如果采用统一的话,会更方便,但实际开发中uuid也是会遇到很多问题的,对于数据量较大的容易产生重复id的,就是用uuid,对于在一个系统中很少数据的,就是用int就可以了.就那这个论坛为例吧,刚开始时我全部用uuid,到最后竟然出现了传值时value太长,超过number类型的最大范围这个异常,尴尬!到现在也没弄清楚为什么,怎么会出现number呢?应该是varchar才对呀?没办法,换id!但是,请别误会我是被逼才换的,我接触过几个很大的系统,其中一个是广电的收视率调查,整个系统由七个子系统构成,极其复杂,而且要调查收视率,就要统计某个时段内某个频道的在线用户数,系统数据量非常大,其中的id就是采用多种,不是说一个系统采用一种,而是各个小系统也采用多种,这样可以更好的利用空间.这个论坛因为主要是处理帖子的,所以Forum这个类就采用uuid了;board版区一般就10个一下吧,所以采用int类型的.
再总结一下:一个系统的id可以有多种,完全不用担心映射的问题,因为说白了,配置的那些映射,一对一的,多对一的,多对多使用中间表的,其实保存的映射关系还是一个id在表里面,如果不建立关联关系,自己维护的话,也就是将id保存到对应的位置.只不过配置了关系的,保证了数据之间的完整性,但是操作比较复杂,要先获得关系对象,再获得对象的属性. 接下来说说这个系统的数据库设计吧,比较简单,先上图吧:
说明一下:这个图有很多问题的,这是我刚开始设计时的图,虽然程序改过很多,但是图没改过,好多id都是string类型的.还有一点说明,我基本不会UML,图是我按自己的想法画的,如果在bean类里面需要声明一个其他类的对象,那就在旁边有一个其他类的声明出来的对象,和bean类保持一致,多的一端用*,一的一端就用1表示,大家凑合着看,悠着点批评,我真的不会uml,真是悲剧. Permission: public class Permission implements Serializable { private String id; private String permissionName; private String resource;//页面路径,localhost:8088/bbsns/userInfo.bbsns private String action;//采取的操作,action=reg private int typeID; private Set roles; } 插入操作: public static Permission p101 = new Permission("发帖权限", "/forum", "post,postSave", 2); public static Permission p102 = new Permission("查看主帖列表权限", "/forum", "listForums", 2); public static Permission p103 = new Permission("查看精华帖列表权限", "/forum", "listForumsElite", 2); 如果注册,只需要点击这个连接,对应的action类就会自动执行reg方法,我的action类全部集成自一个BaseAction,这个类是来自其他项目的: public class BaseAction extends ActionSupport{ private String action="index"; protected String executeMethod(String method) throws Exception { Class[] c = null; Method m = this.getClass().getMethod(method, c); Object[] o = null; String result = (String) m.invoke(this, o); return result; } public String execute() { try { System.out.println("BaseAction.execute:"+this.getAction()+" method execute!!!"); return this.executeMethod(this.getAction()); } catch (Exception e) { System.out.println("BaseAction.execute:"+this.getAction()+" has a problem!!!"); return ERROR; } } } 在权限拦截器里面,获取localhost:8088/bbsns/userInfo.bbsns?action=reg(action后缀改成了bbsns)里面的action userInfo和要采用的action reg,和用户的权限对比,如果对应,就通过. 整个系统的权限是按照RBAC权限模型来设计的,但不完全是,可以说是我在学习了之后自己做出来的,权限和角色之间是多对多关联,用户组和角色之间也是多对多关联,但是我限制了用户和用户组的关系,一个用户的身份只能属于一个用户组.整个系统的权限分两条主线,一条是用户权限,刚才已经介绍过了,还有一条是版区权限,图上上面那条.一个版区允许采用的操作就是这个版区的权限,权限拦截器里同时拦截版区id和用户组id,不同的用户组有不同的权限,注册用户只能看,不能发帖回帖等. BoardPermission: public class BoardPermission implements Serializable { private String id; private long boardID; private String groupID; private Set permissions; } 最后是版主权限,一个版区可以有多位版主,一个版主也可以管理多个版区,所以采用多对多的,在角色表里有对应的版主角色,这样在拦截器里就可以获得版主的角色,通过角色就可以拿到权限. 这样一个人在这个论坛中的权限就是自己的权限和版区权限之和,如果这个人是版主,那么他的权限就是版区权限加上个人权限加上版主权限. 对于角色权限控制就到这里吧,也不知道说清楚了没,基于RBAC的权限模型论坛里有很多,大家可以下载看看.我觉得这个系统最难得地方就是权限控制了,如果权限设置好了,其他的都是体力活了.在上一篇中,有人质疑我从数据库开始设计,其实说白了,我不懂什么设计,刚开始时就是画图,我觉得就是在设计数据库,或者说是在设计数据库的模型bean类,设计完之后先导出表看看没有问题了,再dao,service,action,jsp一步一步来,我觉得这个步骤挺好的,不知道大家怎么看? 好了,这次就到这里,欢迎大家讨论交流,谢谢大家读这篇文章.
原创首发,谢谢支持!
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-10-09
见证一个奇迹的诞生
|
|
返回顶楼 | |
浏览 1293 次