- 浏览: 746462 次
- 性别:
- 来自: 湖北
-
文章分类
最新评论
-
SE_XiaoFeng:
用mysqldump命令行导出。这个报错唉。错误提示信息如下: ...
linux下如何导入导出MySQL数据库 -
SE_XiaoFeng:
文章写的干脆了当,我喜欢!
linux下如何导入导出MySQL数据库 -
niky6688:
网站咋打不开呢
beckham herms birki ...
【原创】上周给公司新做了一个网站,请大家审阅! -
niky6688:
哈哈
new chanel bags 2012
burbe ...
今天我抢了一个咪咪??? -
ydsakyclguozi:
...
jsp资源管理器也可能是木马
开发数据库管理类的软件,不可能不考虑多用户和用户权限设置的问题。尽管目前市面上的大、中型的后台数据库系统软件都提供了多用户,以及细至某个数据库内某张表的权限设置的功能,我个人建议:一套成熟的数据库管理软件,还是应该自行设计用户管理这块功能,原因有二:
1.那些大、中型后台数据库系统软件所提供的多用户及其权限设置都是针对数据库的共有属性,并不一定能完全满足某些特例的需求;
2.不要过多的依赖后台数据库系统软件的某些特殊功能,多种大、中型后台数据库系统软件之间并不完全兼容。否则一旦日后需要转换数据库平台或后台数据库系统软件版本升级,之前的架构设计很可能无法重用。
下面看看如何自行设计一套比较灵活的多用户管理模块,即该数据库管理软件的系统管理员可以自行添加新用户,修改已有用户的权限,删除已有用户。首先,分析用户需求,列出该数据库管理软件所有需要实现的功能;然后,根据一定的联系对这些功能进行分类,即把某类用户需使用的功能归为一类;最后开始建表:
功能表(Function_table) 名称 类型 约束条件 说明 f_id int 无重复 功能标识,主键 f_name char(20) 不允许为空 功能名称,不允许重复 f_desc char(50) 允许为空 功能描述 用户组表(User_group) 名称 类型 约束条件 说明 group_id int 无重复 用户组标识,主键 group_name char(20) 不允许为空 用户组名称 group_power char(100) 不允许为空 用户组权限表,内容为功能表f_id的集合 用户表(User_table) 名称 类型 约束条件 说明 user_id int 无重复 用户标识,主键 user_name char(20) 无重复 用户名 user_pwd char(20) 不允许为空 用户密码 user_type int 不允许为空 所属用户组标识,和User_group.group_id关联
采用这种用户组的架构设计,当需要添加新用户时,只需指定新用户所属的用户组;当以后系统需要添加新功能或对旧有功能权限进行修改时,只用操作功能表和用户组表的记录,原有用户的功能即可相应随之变化。当然,这种架构设计把数据库管理软件的功能判定移到了前台,使得前台开发相对复杂一些。但是,当用户数较大(10人以上),或日后软件升级的概率较大时,这个代价是值得的。
四、简洁的批量m:n设计
碰到m:n的关系,一般都是建立3个表,m一个,n一个,m:n一个。但是,m:n有时会遇到批量处理的情况,例如到图书馆借书,一般都是允许用户同时借阅n本书,如果要求按批查询借阅记录,即列出某个用户某次借阅的所有书籍,该如何设计呢?让我们建好必须的3个表先:
书籍表(Book_table) 名称 类型 约束条件 说明 book_id int 无重复 书籍标识,主键 book_no char(20) 无重复 书籍编号 book_name char(100) 不允许为空 书籍名称 …… 借阅用户表(Renter_table) 名称 类型 约束条件 说明 renter_id int 无重复 用户标识,主键 renter_name char(20) 不允许为空 用户姓名 …… 借阅记录表(Rent_log) 名称 类型 约束条件 说明 rent_id int 无重复 借阅记录标识,主键 r_id int 不允许为空 用户标识,和Renter_table.renter_id关联 b_id int 不允许为空 书籍标识,和Book_table.book_id关联 rent_date datetime 不允许为空 借阅时间 ……
为了实现按批查询借阅记录,我们可以再建一个表来保存批量借阅的信息,例如:
批量借阅表(Batch_rent) 名称 类型 约束条件 说明 batch_id int 无重复 批量借阅标识,主键 batch_no int 不允许为空 批量借阅编号,同一批借阅的batch_no相同 rent_id int 不允许为空 借阅记录标识,和Rent_log.rent_id关联 batch_date datetime 不允许为空 批量借阅时间
这样的设计好吗?我们来看看为了列出某个用户某次借阅的所有书籍,需要如何查询?首先检索批量借阅表(Batch_rent),把符合条件的的所有记录的rent_id字段的数据保存起来,再用这些数据作为查询条件带入到借阅记录表(Rent_log)中去查询。那么,有没有什么办法改进呢?下面给出一种简洁的批量设计方案,不需添加新表,只需修改一下借阅记录表(Rent_log)即可。修改后的记录表(Rent_log)如下:
借阅记录表(Rent_log) 名称 类型 约束条件 说明 rent_id int 无重复 借阅记录标识,主键 r_id int 不允许为空 用户标识,和Renter_table.renter_id关联 b_id int 不允许为空 书籍标识,和Book_table.book_id关联 batch_no int 不允许为空 批量借阅编号,同一批借阅的batch_no相同 rent_date datetime 不允许为空 借阅时间 ……
其中,同一次借阅的batch_no和该批第一条入库的rent_id相同。举例:假设当前最大rent_id是64,接着某用户一次借阅了3本书,则批量插入的3条借阅记录的batch_no都是65。之后另外一个用户租了一套碟,再插入出租记录的rent_id是68。采用这种设计,查询批量借阅的信息时,只需使用一条标准T_SQL的嵌套查询即可。当然,这种设计不符合3NF,但是和上面标准的3NF设计比起来,哪一种更好呢?答案就不用我说了吧。
五、冗余数据的取舍
上篇的“树型关系的数据表”中保留了一个冗余字段,这里的例子更进一步——添加了一个冗余表。先看看例子:我原先所在的公司为了解决员工的工作餐,和附近的一家小餐馆联系,每天吃饭记账,费用按人数平摊,月底由公司现金结算,每个人每个月的工作餐费从工资中扣除。当然,每天吃饭的人员和人数都不是固定的,而且,由于每顿工作餐的所点的菜色不同,每顿的花费也不相同。例如,星期一中餐5人花费40元,晚餐2人花费20,星期二中餐6人花费36元,晚餐3人花费18元。为了方便计算每个人每个月的工作餐费,我写了一个简陋的就餐记账管理程序,数据库里有3个表:
员工表(Clerk_table) 名称 类型 约束条件 说明 clerk_id int 无重复 员工标识,主键 clerk_name char(10) 不允许为空 员工姓名 每餐总表(Eatdata1) 名称 类型 约束条件 说明 totle_id int 无重复 每餐总表标识,主键 persons char(100) 不允许为空 就餐员工的员工标识集合 eat_date datetime 不允许为空 就餐日期 eat_type char(1) 不允许为空 就餐类型,用来区分中、晚餐 totle_price money 不允许为空 每餐总花费 persons_num int 不允许为空 就餐人数 就餐计费细表(Eatdata2) 名称 类型 约束条件 说明 id int 无重复 就餐计费细表标识,主键 t_id int 不允许为空 每餐总表标识,和Eatdata1.totle_id关联 c_id int 不允许为空 员工标识标识,和Clerk_table.clerk_id关联 price money 不允许为空 每人每餐花费
其中,就餐计费细表(Eatdata2)的记录就是把每餐总表(Eatdata1)的一条记录按就餐员工平摊拆开,是个不折不扣的冗余表。当然,也可以把每餐总表(Eatdata1)的部分字段合并到就餐计费细表(Eatdata2)中,这样每餐总表(Eatdata1)就成了冗余表,不过这样所设计出来的就餐计费细表重复数据更多,相比来说还是上面的方案好些。但是,就是就餐计费细表(Eatdata2)这个冗余表,在做每月每人餐费统计的时候,大大简化了编程的复杂度,只用类似这么一条查询语句即可统计出每人每月的寄餐次数和餐费总帐:
SELECT clerk_name AS personname,COUNT(c_id) as eattimes,SUM(price) AS ptprice FROM Eatdata2 JOIN Clerk_tabsle ON (c_id=clerk_id) JOIN eatdata1 ON (totleid=tid) WHERE eat_date>=CONVERT(datetime,'"&the_date&"') AND eat_date<DATEADD(month,1,CONVERT(datetime,'"&the_date&"')) GROUP BY c_id
想象一下,如果不用这个冗余表,每次统计每人每月的餐费总帐时会多麻烦,程序效率也够呛。那么,到底什么时候可以增加一定的冗余数据呢?我认为有2个原则:
1、用户的整体需求。当用户更多的关注于,对数据库的规范记录按一定的算法进行处理后,再列出的数据。如果该算法可以直接利用后台数据库系统的内嵌函数来完成,此时可以适当的增加冗余字段,甚至冗余表来保存这些经过算法处理后的数据。要知道,对于大批量数据的查询,修改或删除,后台数据库系统的效率远远高于我们自己编写的代码。
2、简化开发的复杂度。现代软件开发,实现同样的功能,方法有很多。尽管不必要求程序员精通绝大部分的开发工具和平台,但是还是需要了解哪种方法搭配哪种开发工具的程序更简洁,效率更高一些。冗余数据的本质就是用空间换时间,尤其是目前硬件的发展远远高于软件,所以适当的冗余是可以接受的。不过我还是在最后再强调一下:不要过多的依赖平台和开发工具的特性来简化开发,这个度要是没把握好的话,后期维护升级会栽大跟头的。
发表评论
-
几种常用数据库比较
2010-09-08 08:08 1111目前,商品化的数据库 ... -
MySQL出错代码列表
2010-02-03 12:44 5421005:创建表失败 ... -
linux下如何导入导出MySQL数据库
2009-12-23 11:27 5198一、导出: 用mysqldump命令行 命令格 ... -
SQL操作全集
2009-12-03 18:04 644SQL操作全集 下 ... -
MySQL导入导出.sql文件步骤如下
2009-12-01 16:11 1159一.MySQL的命令行模式 ... -
java调用mysql命令 导入导出数据库
2009-11-25 17:05 1904具体的相关类 及 驱动文件 见 附件 package ... -
SQL命令导入导出大全
2009-11-22 14:39 1507EXEC master..xp_cmdshell ’b ... -
MySQL 建表语法
2009-11-20 13:37 16721、最简单的: CREATE TAB ... -
insert into select 复制表
2009-11-05 14:39 1105insert into 目标表 (pw ) select pw ... -
MySQL:MySQL 创建存储过程(MySQL 5.0)
2009-11-04 17:32 1373MySQL 存储过程是从 MySQL ... -
SQL Server 高效分页,没有比这更好的了!
2009-11-04 17:18 2480-- @PageNo : 第几页 -- @PageSize ... -
MySQL中将一个表数据批量导入另一表
2009-11-04 16:50 1830不管是在网站开发还是在应用程序开发中,我们经常会碰到需要将My ... -
MySQL字段类型的选择与MySQL的查询效率
2009-10-21 23:35 2188要选择有助于使查询执 ... -
三种数据库利用SQL语句进行高效果分页
2009-10-21 23:33 903在程序的开发过程中,处理分页是大家接触比较频繁的事件,因为现在 ... -
MySQL查询及删除重复记录的方法
2009-10-21 15:51 1823(一) 1、查找表中多余的重复记录,重复记录是根据单个字段(p ... -
mysql数据库中常见错误提示及解决方法
2009-10-15 18:26 1473mysql数据库中常见错误提示及解决方法 phpma.com ... -
自动增长字段
2009-10-12 16:32 1095Oracle 1、建用户数据表 drop ... -
无法连接 远程IP上的mysql 数据库???
2009-09-09 18:04 2429如果你想连接你的mysql的时候发生这个错误: 以下是引用内 ... -
SQL精华收集
2009-08-24 18:39 1024SQL精华收集 order by 的数值型灵活使用 selec ... -
mysql 5.0存储过程学习总结
2009-05-13 22:18 1016一.创建存储过程 1.基本语法: create proce ...
相关推荐
理解数据库设计的基本原理,如数据表的创建、数据的增删改查,以及关系数据库的概念,对提高后端开发能力非常有帮助。 此外,《细说PHP》还可能包含对PHP中常用的设计模式的介绍,设计模式是解决软件设计中常见问题...
内容涵盖了PHP的运行环境搭建、Web服务器Apache的配置与应用、动态网站开发的前台技术、PHP编程语言的语法、PHP的常用功能模块和实用技巧、MySQL数据库的设计与应用、PHP 5面向对象的程序设计思想、Web开发的设计...
内容涵盖了PHP的运行环境搭建、Web服务器Apache的配置与应用、动态网站开发的前台技术、PHP编程语言的语法、PHP的常用功能模块和实用技巧、MySQL数据库的设计与应用、PHP 5面向对象的程序设计思想、Web开发的设计...
书中关于MySQL的章节,将引导读者学习数据库设计的基础原则,掌握SQL语句的编写技巧,如何高效地进行数据的增删改查操作,以及如何通过数据库连接和事务处理来提升数据管理的稳定性和安全性。这些数据库知识的掌握,...
尽管文件名看起来像是一个网站的介绍,但实际内容可能包含PHP编程相关的实例,例如如何使用PHP进行用户注册、登录系统的设计、数据验证、会话管理等。这个文件可能展示了如何将PHP与数据库结合,实现一个简单的婚恋...
内容涵盖了动态网站开发的前台技术(HTML+CSS)、PHP编程语言的语法、PHP的常用功能模块和实用技巧、MySQL数据库的设计与应用、PHP面向对象的程序设计思想、数据库抽象层PDO、Smarty模板技术、Web开发的设计模式、...
内容涵盖了动态网站开发的前台技术(HTML+CSS)、PHP编程语言的语法、PHP的常用功能模块和实用技巧、MySQL数据库的设计与应用、PHP面向对象的程序设计思想、数据库抽象层PDO、Smarty模板技术、Web开发的设计模式、...
11. PHP高级话题:包括命名空间、设计模式、PHP的垃圾回收机制、性能优化技巧等,帮助读者深入理解PHP的内在工作原理。 12. PHP框架介绍:简述一些流行的PHP框架,如Laravel、Symfony、Yii等,以及它们在实际项目中...
9. **数据库交互**:PDO和mysqli扩展的使用,SQL查询的执行流程,以及事务处理和预编译语句。 10. **会话管理**:PHP的session机制,包括会话存储、会话ID生成和管理、会话超时等。 11. **CLI模式**:除了Web应用...
源码可能包含对数组的各种操作,如创建、遍历、排序、搜索等,这有助于理解数据组织和处理的技巧。 4. PHP文件系统操作:PHP可以用来读写文件、目录操作、文件上传下载等。源码中可能会涉及这些功能的实现,让你...
11. **MySQL数据库设计**:测试了SQL语句的使用,包括SELECT、INSERT、UPDATE和DELETE,以及索引、视图和存储过程的创建。 12. **PHP的mysqli扩展**:使用mysqli进行数据库连接、查询和事务处理,以及预处理语句和...
在"高洛峰细说PHP第二版配套源码"中,你可以找到与书中各个章节对应的示例代码,这些代码涵盖了PHP的基础语法、面向对象编程、数据库操作、Web开发、错误处理、函数库应用等多个方面。 1. PHP基础语法:源码中包含...
这些内容在第二版中会有详细阐述,通过源码分析,读者可以更直观地理解面向对象的设计模式。 3. PHP函数库:PHP拥有丰富的内置函数库,涵盖字符串处理、数组操作、文件系统操作、网络通信等多个方面。附加章节可能...
内容涵盖了PHP的运行环境搭建、Web服务器Apache的配置与应用、动态网站开发的前台技术、PHP编程语言的语法、PHP的常用功能模块和实用技巧、MySQL数据库的设计与应用、PHP 5面向对象的程序设计思想、Web开发的设计...
《PHP细说17章信息发布系统》是一套专为初学者设计的学习资源,它涵盖了从基础到实践的全面PHP知识,旨在帮助新手快速掌握PHP编程技能,并能够构建一个实际的信息发布系统。在这个系统中,你将了解到如何利用PHP语言...
5. **《MySQL Cookbook》**:类似于《PHP Cookbook》,但专注于MySQL的操作和优化技巧,非常适合希望深入了解MySQL数据库管理的开发者。 通过阅读这些书籍,不仅可以获得PHP与MySQL Web开发所需的理论知识和技术...
5. **学习资源**:由于这是韩顺平老师的教学实例,所以源码中应该包含详细的注释和指导,便于学习者理解代码逻辑和应用技巧,提升自身的JSP和JavaMail技术水平。 在【压缩包子文件的文件名称列表】中,尽管没有具体...
本教程以实例驱动,通过一系列精心设计的项目,逐步引导读者熟悉和掌握Visual C++ 6.0的各项功能和编程技巧。首先,你会了解到如何安装和配置Visual C++ 6.0 IDE,包括设置编译器选项、创建新工程以及管理源代码文件...
10. **其他资源**:还包括了张诚的UI视频教程、经典版PHP视频教程、《细说PHP》第二版光盘的内容,以及关于求职和面试技巧的“明哥聊求职”系列。 这些资源不仅适合自学,也适合作为教学资料,涵盖了从Web前端到...
经验04 数据库设计经验谈 经验05 项目实战经验谈 第2篇 陷阱或谬误篇 第3章 不可忽视的30个技术陷阱 陷阱01 版本不一致产生的陷阱 陷阱02 结构初始化产生的陷阱 陷阱03 传递派生类产生的陷阱 陷阱04 用DataReader...