今天由袁龙友老师讲解SQL Server数据库, 袁老师将通过SQL Server来向各位学员传授数据库设计的思想,这也是在软件开发过程中最重要的一个环节。在现代的软件开发中,尤其是B/S结构的开发,几乎所有的编码都是围绕着数据库来进行的。所以,好的数据库设计,是整个软件项目成败的关键。下面是方老师和张挺等记录的培训日记:
袁老师说,一个不好的数据库设计,在当时是看不出来的,只有在进行开发的过程中,才知道会遇到这样和那样的问题,到最后,又不得不修改表结构……以前已经进行的编码又要推翻……费时费力。可见,数据库的设计,在软件开发过程中的重要性是不亚于整个系统的架构的。
袁老师说的好:“设计出好的数据库,基础理论知识固然重要,但是经验更重要。”事实也是如此,学完SQL语句的基本内容,只需要两天,但是要根据这些语句来设计出性能优越的数据库,可能需要二十年经验的积累。这也正如中国人学英语,26个字母很快可以学会,但是,正是这看似简单的26个字母的组合,却使得无数英雄尽折腰。当然,目前对学员来说,最重要的还是练习,就算是很差的设计,只要是自己在键盘上敲出来,就是好样的。谁也不能保证一开始就设计出考虑很周全的数据库,袁老师在课堂上也举出一些自己或者自己看见过的设计失败的例子。
数据库的概念:数据库,顾名思义,就是用来存储数据的仓库。数据库系统的本质:所谓的一个系统,实际上就是一个程序。数据库的分类:关系型数据库和非关系型数据库,大型数据库和桌面数据库。关于SQL语句:SQL语句是一个标准,但是各个厂家的实现又不尽相同。所以又分出了T-SQL,PL-SQL等。主键存在的意义,备选主键列:如身份证号
数据行的存放:每页大小只有8kb,8页称为一个盘区,且一行记录不能跨页,那我们为什么能将很大的一个文件存储进数据库呢?
文件组的作用:
日志的相关知识:(很重要)日志文件记录每一步操作。日志文件与数据库文件应放置到不同磁盘上。备份截断日志,Archive模式。日志的本质:记录了文件操作的过程,并且还记录了受这些操作所影响到的数据。具体的说,如果是insert语句,则记录该语句即可。如果是delete语句,则不仅需要记录语句,还需要记录影响的数据。如果是update语句,则需要记录语句以及修改前和修改后的数据。记录日志的流程:1.发送请求。2.把相关的数据读入缓冲区。3.在日志文件中记录操作的过程和参数。4.修改缓冲区的内容。5.检查程序向数据库写入已提交的事务(进行一次或者多次数据修改)。
日志传递:将日志文件定期的传到不同的机器上。备份数据库:日志是滚动的,写一段会将前面的覆盖掉。(Archive模式)SQL Server2000采取的是截断方式,生成备份。
索引的相关知识:为什么要引入索引的概念?索引解决了什么问题,桥梁监测的传感器数据不用加索引,因为全部是插入数据。如果字段超过25位,那在做索引的意义就不大了。字段的可选值太少,也无做索引的必要,例如,性别只有男女。建索引之后可能出现的潜在问题:医院挂号的故事,索引页很稀疏,索引页整理时导致页面调整,为此,引出了填充因子。
索引重建:数据库维护时,每过一段时间都需要根据填充率来维护索引。
安装SQL Server中的问题:指定实例的名称(实例名),默认的实例名为机器名。 安装时如果不使用默认的实例名,程序中的连接串要加上该实例名。安装时一般不允许有多个实例(若有多个CPU时,可以考虑)。 SQL Server2005的安装中,选择windows模式和混合模式的区别。SQL Server2005和Oracle中都有Schema的概念(与XML中的Schema是不一样的),可以将其理解为觉得,或者虚拟的用户。其中,SQL Server中一个实例中有多个库,而Oracle中只有一个。(与SQL Server2000差别较大)在SQL Server中的表名形如dbo.table_1样式,其中dbo就是一个Schema。关于Schema的更多内容,自己查看SQL Server的帮助文档。
创建数据库时除了指定库名,还可以指定文件组名与数据库大小等信息所有的SQL语句一次性的发给SQL服务器,以go命令为分界符,每遇到go命令执行一次,但是在java程序中,JDBC编程的代码不能使用go命令。
数据库文件在管理系统中,不能拷贝,如果要拷贝,必须分离(dtouch命令),要加到管理系统中再用“附加”或者备份——还原。
自动增长列的实现原理:专门有一张隐含的表来记录每条记录的序号。
NULL的本质:它不表示0也不表示“null”字符串,它表示字段中没有任何内容,取值时要注意判断内容是否为空。
SQL Server中用bit来表示其他数据库中的boolean。
(1) true=1,false=0,在java中的值是什么可能与具体的类型有关系,如果getString与getLong得到的结果不同。
(2) 在数据库中定义的float类型,在java中取的值一样吗?需要通过实验验证。
(3) char/varchar/nchar/nvarchar都采用unicode字符编码,例如,填写籍贯时使用varchar(20)表示可以存20个英文字符,html(表单验证、字符长度判断中英文不同,这时使用nvarchar可以直接判断长度不大于20)
(4) datetime的值从1970年开始计算,如果用它来表示公元前的时间,是没有办法做到了。举了一个文物保护系统的例子,最后多用了一个字段来判断是否是公元前,再用一个int来保存年份。
(5) 如果需要保存一个变量,如人的年龄,今年和明年不一样,如何解决?应该使用计算列,例如:select datediff(yyyy,’1980-01-01’,getDate());其中,填写公式时,如果公式中用到的变量与系统关键字同名,应用[]括起来,如[date]表示一个名字叫date的变量。
![](https://img2024.cnblogs.com/blog/35695/202408/35695-20240826070647288-243310440.jpg)