今天来说说数据库的设计,现在一般用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一步一步来,我觉得这个步骤挺好的,不知道大家怎么看?
好了,这次就到这里,欢迎大家讨论交流,谢谢大家读这篇文章.
原创首发,谢谢支持!
- 大小: 15.4 KB
分享到:
相关推荐
在“空中鼠标控制——抛砖引玉”这个项目中,核心是利用双目摄像头来获取用户的手部或任何指定物体的三维空间坐标。双目摄像头,顾名思义,是由两个摄像头组成,通过三角测量原理来计算物体与摄像头之间的距离。它的...
算法优化抛砖引玉-主要是一些算法的实现
从提供的文件内容中,我们可以梳理出以下几个关于监控和运维的重要知识点: 1. 理想监控系统的五个关键特性: - 完善的管理系统:能够一目了然地展现系统状态,帮助运维人员快速定位问题。 - 强大的配置系统:...
【房地产兵法论专集之二十-抛砖引玉】这篇文档虽然以古代战争中的兵法故事开场,但实质上是探讨房地产市场的策略和现象。"抛砖引玉"原指用普通物品吸引更高价值的物品,文中以此比喻房地产市场中高价房产的价值与其...
这份"抛砖引玉熊市主图"文档提供的源码,就是一个实例,展示了如何通过计算和分析价格、成交量等数据来评估市场的牛熊状态。 首先,公式中的"SW1"是一个短期和长期移动平均线的综合指标,它是5日指数移动平均线...
这是梦幻西游使用的was文件的查看工具,在编写时看了不少WasTools的代码,终于对was文件有个初步的了解了,在查看挑选图片时比原作者云风的waskey方便一点,但运行时间一长就会冒出个Out of system resource的错误,...
从零开始深度学习:TinyMind汉字书法识别 操作步骤 从官网下载,并解压到当前文件夹。产生train test1 两个文件 运行data.py文件,进行转录,将原始数据集转录为numpy矩阵,生成data.npy及label.npy 运行train.py...
#### 三、SAS视窗操作 虽然SAS可以通过命令行进行操作,但对于初学者来说,使用SAS的图形用户界面(GUI)可以更快上手。SAS Enterprise Guide等工具提供了一个直观的操作环境,用户可以通过点击菜单和按钮来执行...
1.拷贝CANBus文件夹到D:\WINCE600\PLATFORM\SMDK6410\SRC\DRIVERS 目录下 2.在dirs文件中添加CANBus ...注意:驱动中默认波特率为100K,本源码只是个抛砖引玉的作用。可以根据项目实际情况加以修改。
针对开关电源很多人觉得很难,其实不然。设计一款开关电源并不难,难就难在做精,等你真正入门了,积累一定的经验,再采用分立的结构进行设计就...万事开头难,笔者在这就抛砖引玉,慢慢讲解如何一步一步设计开关电源。
此资源为抛砖引玉,仅为赶时间速成的同学提供完整的项目案例。 ------------------------------------------------------------- 执行项目需要提前安装好python环境(anaconda、pycharm)以及selenium依赖包(pip ...
WPF是微软新一代图形系统,运行在.NET Framework 3.0架构下,为用户界面、2D/3D 图形、文档和媒体提供了统一的描述和操作方法。基于DirectX 9/10技术的WPF不仅带来了前所未有的3D界面,而且其图形向量渲染引擎也大大...
利用delaunay函数划分网格欢迎指点探讨-DelaunayWithGrid.m 本帖最后由 liuf412044725 于 2013-6-8 17:47 编辑 近期论坛上有不少讨论delaunay函数的帖子。似乎主要有以下问题: 1、delaunay函数各参数的意义 ...
这个仓库主要是前段时间参加2018研究生数学建模大赛的经验与心得,但是第二问,第三问做的太烂,所以只放我们团队第一问的方案和源码,在此抛砖引玉,欢迎大家批评指正。具体内容分析可以查看我的博客,我的博客地址...
一位有心人写得很好的SAS基础知识介绍,值得一读。 前 言 --不要把学SAS 当作一件很时髦的事情,能用简单软件完成...而不是刚会走就想着跑甚至想飞,还没学几条语句就想去做统计分析,到头来发现错误百出而又手足无措
SAS语言抛砖引玉》 任何想学习和了解SAS语言的人,学习SAS的好材料,确实很有用。
#### 三、Apache安装与配置 1. **安装步骤**: - **下载地址**:[Apache 2.2.6](http://www.apache.org/dist/httpd/binaries/win32/apache_2.2.6-win32-x86-openssl-0.9.8e.msi) - **安装过程**:双击安装程序后...
本版本自己实现Raize控件组中TCheckTree,并将所有与Raize控件相关代码更新,现在的版本不使用任何的第三方组件,DELPHI7下直接编译通过。这里要注意的是系统的初始密码,您如果看代码,在uAuthAppFactory单元,有一...