仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1162|回复: 8
打印 上一主题 下一主题

[学习教程] MSSQL网页设计浅谈数据库计划技能(下).txt

[复制链接]
灵魂腐蚀 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:33:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
提供用于管理、检查、优化数据库操作的管理工具。技能|计划|数据|数据库|数据库计划
  3、多用户及其权限办理的计划
  开辟数据库办理类的软件,不成能不思索多用户和用户权限设置的成绩。只管今朝市情上的年夜、中型的背景数据库体系软件都供应了多用户,和细至某个数据库内某张表的权限设置的功效,我团体倡议:一套成熟的数据库办理软件,仍是应当自行计划用户办理这块功效,缘故原由有二:
  1.那些年夜、中型背景数据库体系软件所供应的多用户及其权限设置都是针对数据库的共有属性,其实不必定能完整满意某些惯例的需求;
  2.不要过量的依附背景数据库体系软件的某些特别功效,多种年夜、中型背景数据库体系软件之间其实不完整兼容。不然一旦往后必要转换数据库平台或背景数据库体系软件版本晋级,之前的架构计划极可能没法重用。

  上面看看怎样自行计划一套对照天真的多用户办理模块,即该数据库办理软件的体系办理员能够自行增加新用户,修正已有效户的权限,删除已有效户。起首,剖析用户需求,列出该数据库办理软件一切必要完成的功效;然后,依据必定的接洽对这些功效举行分类,即把某类用户需利用的功效回为一类;最初入手下手建表:
  
功效表(Function_table)
称号  范例 束缚前提   申明
f_idint 无反复  功效标识,主键
f_namechar(20)不同意为空功效称号,不同意反复
f_descchar(50)同意为空功效形貌

用户组表(User_group)
称号  范例 束缚前提   申明
group_idint无反复用户组标识,主键
group_namechar(20)不同意为空用户组称号
group_powerchar(100)同意为空用户组权限表,内容为功效表f_id的汇合

用户表(User_table)
称号    范例    束缚前提   申明
user_idint无反复用户标识,主键
user_namechar(20)无反复用户名
user_pwdchar(20)不同意为空用户暗码
user_typeint不同意为空所属用户组标识,和User_group.group_id联系关系

  接纳这类用户组的架构计划,当必要增加新用户时,只需指定新用户所属的用户组;当今后体系必要增加新功效或对旧有功效权限举行修正时,只用操纵功效表和用户组表的纪录,原有效户的功效便可响应随之变更。固然,这类架构计划把数据库办理软件的功效判断移到了前台,使得前台开辟绝对庞大一些。可是,当用户数较年夜(10人以上),或往后软件晋级的几率较年夜时,这个价值是值得的。


  4、简便的批量m:n计划
  碰着m:n的干系,一样平常都是创建3个表,m一个,n一个,m:n一个。可是,m:n偶然会碰到批量处置的情形,比方到藏书楼借书,一样平常都是同意用户同时借阅n本书,假如请求按批查询借阅纪录,即列出某个用户某次借阅的一切书本,该怎样计划呢?让我们建好必需的3个表先:

书本表(Book_table)
称号   范例    束缚前提   申明
book_idint无反复书本标识,主键
book_nochar(20)无反复书本编号
book_namechar(100)不同意为空书本称号
……

借阅用户表(Renter_table)
称号    范例    束缚前提   申明
renter_idint无反复用户标识,主键
renter_namechar(20)不同意为空用户姓名
……

借阅纪录表(Rent_log)
称号   范例    束缚前提   申明
rent_idint无反复借阅纪录标识,主键
r_idint不同意为空用户标识,和Renter_table.renter_id联系关系
b_idint不同意为空书本标识,和Book_table.book_id联系关系
rent_datedatetime不同意为空借阅工夫
……

  为了完成按批查询借阅纪录,我们能够再建一个表来保留批量借阅的信息,比方:

批量借阅表(Batch_rent)
称号   范例   束缚前提   申明
batch_idint无反复批量借阅标识,主键
batch_noint不同意为空批量借阅编号,统一批借阅的batch_no不异
rent_idint不同意为空借阅纪录标识,和Rent_log.rent_id联系关系
batch_datedatetime不同意为空批量借阅工夫

  如许的计划好吗?我们来看看为了列出某个用户某次借阅的一切书本,必要怎样查询?起首检索批量借阅表(Batch_rent),把切合前提的的一切纪录的rent_id字段的数据保留起来,再用这些数据作为查询前提带进到借阅纪录表(Rent_log)中往查询。那末,有无甚么举措改善呢?上面给出一种简便的批量计划计划,不需增加新表,只需修正一下借阅纪录表(Rent_log)便可。修正后的纪录表(Rent_log)以下:

借阅纪录表(Rent_log)
称号   范例   束缚前提   申明
rent_idint无反复借阅纪录标识,主键
r_idint不同意为空用户标识,和Renter_table.renter_id联系关系
b_idint不同意为空书本标识,和Book_table.book_id联系关系
batch_noint不同意为空批量借阅编号,统一批借阅的batch_no不异
rent_datedatetime不同意为空借阅工夫
……

  个中,统一次借阅的batch_no和该批第一条进库的rent_id不异。举例:假定以后最年夜rent_id是64,接着某用户一次借阅了3本书,则批量拔出的3条借阅纪录的batch_no都是65。以后别的一个用户租了一套碟,再拔出出租纪录的rent_id是68。接纳这类计划,查询批量借阅的信息时,只需利用一条尺度T_SQL的嵌套查询便可。固然,这类计划不切合3NF,可是和下面尺度的3NF计划比起来,哪种更好呢?谜底就不必我说了吧。


  5、冗余数据的弃取
  上篇的“树型干系的数据表”中保存了一个冗余字段,这里的例子更进一步——增加了一个冗余表。先看看例子:我本来地点的公司为懂得决员工的事情餐,和四周的一家小餐馆接洽,天天用饭记账,用度按人数平摊,月尾由公司现金结算,每一个人每月的事情餐费从人为中扣除。固然,天天用饭的职员和人数都不是流动的,并且,因为每顿事情餐的所点的菜色分歧,每顿的消费也不不异。比方,礼拜一西餐5人消费40元,晚饭2人消费20,礼拜二西餐6人消费36元,晚饭3人消费18元。为了便利盘算每一个人每月的事情餐费,我写了一个大略的就餐记账办理程序,数据库里有3个表:

员工表(Clerk_table)
称号    范例    束缚前提   申明
clerk_idint无反复员工标识,主键
clerk_namechar(10)不同意为空员工姓名

每餐总表(Eatdata1)
称号   范例    束缚前提   申明
totle_idint无反复每餐总表标识,主键
personschar(100)不同意为空就餐员工的员工标识汇合
eat_datedatetime不同意为空就餐日期
eat_typechar(1)不同意为空就餐范例,用来辨别中、晚饭
totle_pricemoney不同意为空每餐总消费
persons_numint不同意为空就餐人数

就餐计费细表(Eatdata2)
称号  范例  束缚前提   申明
idint无反复就餐计费细表标识,主键
t_idint不同意为空每餐总表标识,和Eatdata1.totle_id联系关系
c_idint不同意为空员工标识标识,和Clerk_table.clerk_id联系关系
pricemoney不同意为空每人每餐消费

  个中,就餐计费细表(Eatdata2)的纪录就是把每餐总表(Eatdata1)的一笔记录按就餐员工平摊拆开,是个彻彻底底的冗余表。固然,也能够把每餐总表(Eatdata1)的部分字段兼并到就餐计费细表(Eatdata2)中,如许每餐总表(Eatdata1)就成了冗余表,不外如许所计划出来的就餐计费细表反复数据更多,比拟来讲仍是下面的计划好些。可是,就是就餐计费细表(Eatdata2)这个冗余表,在做每个月每人餐费统计的时分,年夜年夜简化了编程的庞大度,只用相似这么一条查询语句便可统计出每人每个月的寄餐次数和餐费总帐:

SELECTclerk_nameASpersonname,COUNT(c_id)aseattimes,SUM(price)ASptpriceFROMEatdata2JOINClerk_tabsleON(c_id=clerk_id)JOINeatdata1ON(totleid=tid)WHEREeat_date>=CONVERT(datetime,"&the_date&")ANDeat_date
  设想一下,假如不必这个冗余表,每次统计每人每个月的餐费总帐时会多贫苦,程序效力也够戗。那末,究竟甚么时分能够增添必定的冗余数据呢?我以为有2个准绳:

  1、用户的全体需求。当用户更多的存眷于,对数据库的标准纪录按必定的算法举行处置后,再列出的数据。假如该算法能够间接使用背景数据库体系的内嵌函数来完成,此时能够得当的增添冗余字段,乃至冗余表来保留这些经由算法处置后的数据。要晓得,关于多量量数据的查询,修正或删除,背景数据库体系的效力远远高于我们本人编写的代码。
  2、简化开辟的庞大度。古代软件开辟,完成一样的功效,办法有良多。只管不用请求程序员精晓尽年夜部分的开辟工具战争台,可是仍是必要懂得哪一种办法搭配哪一种开辟工具的程序更简便,效力更高一些。冗余数据的实质就是用空间换工夫,特别是今朝硬件的开展远远高于软件,以是得当的冗余是能够承受的。不外我仍是在最初再夸大一下:不要过量的依附平台和开辟工具的特征来简化开辟,这个度如果没掌控好的话,前期保护晋级会栽年夜跟头的。
一个语句分成两个event(实际上不止,其他可以忽略),一个table_mapevent和一个Rows_log_event。Table_mapevent是一样的,主要看Rows_log_event。
再见西城 该用户已被删除
沙发
发表于 2015-1-19 16:29:52 | 只看该作者
个人感觉没有case直观。而且默认的第三字段(还可能更多)作为groupby字段很容易造成新手的错误。
冷月葬花魂 该用户已被删除
板凳
发表于 2015-1-25 21:23:14 | 只看该作者
而写到本地,我又考虑到效率问题.大家来讨论讨论吧,分数不打紧,就给10分,十全十美,没啥对错,各抒己见,但是要有说服力的哦~
莫相离 该用户已被删除
地板
发表于 2015-2-4 03:09:53 | 只看该作者
无法深入到数据库系统层面去了解和探究
小魔女 该用户已被删除
5#
发表于 2015-2-9 13:38:27 | 只看该作者
理解了存储结构,再阅读下性能优化的章节基本上会对sqlserver有个清晰地认识
6#
发表于 2015-2-27 06:38:28 | 只看该作者
入门没那么困难,精通没那么容易
分手快乐 该用户已被删除
7#
发表于 2015-2-27 06:38:28 | 只看该作者
再开发调试阶段和OLAP环境中,外键是可以建立的。新版本中加入了SETNULL和SETDEFAULT属性,能够提供能好的级联设置。
admin 该用户已被删除
8#
发表于 2015-3-16 18:22:36 | 只看该作者
你可以简单地认为适合的就是好,不适合就是不好。
简单生活 该用户已被删除
9#
发表于 2015-3-22 23:59:19 | 只看该作者
我是一个ERP初学者,对于前台运用基本熟悉,但对于后台SQLServer的运用一点也不懂,特想学习下相关资料。至少懂得一些基本的运用。希望各位能给于建议,小弟再谢过!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-8 16:55

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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