设为首页 收藏本站
查看: 714|回复: 0

[经验分享] 关于SQL Server数据库设计的感悟,请指教

[复制链接]

尚未签到

发表于 2015-6-28 20:17:14 | 显示全部楼层 |阅读模式
  有问题的时候,我经常回来博客园寻找答案,久而久之,总结了一些东西。
妄自菲薄,请大家多指出错误,并给出意见

数据库设计三范式基本原则
第一范式:数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。
也就是说,绝对不要出现下面的情况
学生信息
一年一班,97001,张三
这个很容易做到吧,呵呵。

第二范式:数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况),也即所有非关键字段都完全依赖于任意一组候选关键字。
也就是说,绝对不要出现下面的情况
学号姓名年龄课程名称成绩学分
97001张三13化学882

其中学号和课程名称是联合主键

  因为:
(课程名称) → (学分)
(学号) → (姓名, 年龄)

第三范式:在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖,指的是如果存在"A → B → C"的决定关系,则C传递函数依赖于A。因此,满足第三范式的数据库表应该不存在如下依赖关系:
关键字段 → 非关键字段x → 非关键字段y

也就是说,绝对不要出现下面的情况
学号姓名年龄所在学院学院地点学院电话
97001张三13清华中关村8888888

因为:(学号) → (所在学院) → (学院地点, 学院电话)
特别注意:有时为了提高效率,第三范式可以被打破!多见于外键特别多而且数据量巨大的表。为了提高查询的效率,可以牺牲增删改的效率。  关于表、视图、存储过程:
表就是用来存储数据的,要尽量满足三个范式,不要出现冗余的东西。
视图是用来查询数据的,对于没有外键的基础表,可以直接用来查询。对于外键比较多的业务表,查询操作全部要通过视图。
存储过程和触发器我基本不用,我倾向于在数据库层面不要体现太多的业务(甚至不体现),我把业务全部集中在代码层面。其实还有另外一个原因,我不太精通这方面的技术,见谅见谅。

  关于索引:
有朋友举过很好的一个例子,聚合索引就像拼音检索,非聚合索引就像部首索引。
拼音索引在整个字典中都是排好序的,就像查英文单词,你只要按照每页角上的英文索引就可以向后翻或者向前翻来找到你想要的单词。但是想象一下,如果造出了一个新单词,再插入字典中,那将是很恐怖的事情,整个该新单词后面的全部单词全都要向后挪,等于字典重新做了。所以,聚合索引对于查找、排序、筛选(比如,我就想看A到C的所有单词)是很方便的事情。
但是,就算有聚合索引,有的SQL关键字也还是要导致全表扫描的,比如说,我要找类似于*ng的单词(LIKE '%ng'),你就要找遍整个字典(全表扫描),但是如果你找类似于ac*的单词(LIKE 'ac%')就很容易。

  非聚合索引就是一对一个关系了(非聚合索引就是对应每条内容的地址),你找某一条记录一下就可以定位到。大家可以想想什么样的字段可以作为非聚合索引,没错,一个就是类似于单据号的字段,每条记录都不一样,而且几乎每次都只找一条。还有什么?对,外键,外键都要加非聚合索引,我实际测过,一个表有很多外键,视图中都是用Inner Join连接起来的,相比之下,10万条数据,没有建立非聚合外键索引的情况下,试图打开用12秒,为每个外键建立非聚合索引,打开速度马上缩短到6秒。
我引用联机文档中的原话来描述一下:
在创建非聚集索引之前,应先了解访问数据的方式。考虑对具有以下属性的查询使用非聚集索引:

  • 使用 JOIN 或 GROUP BY 子句。
    应为联接和分组操作中所涉及的列创建多个非聚集索引,为任何外键列创建一个聚集索引。
  • 不返回大型结果集的查询。
  • 包含经常包含在查询的搜索条件(例如返回完全匹配的 WHERE 子句)中的列。
  关于主键:
我比较倾向于主键的业务无关性,用的是著名的GUID。虽然占用空间较大,效率也偏低,但是在找不出其它更好的方法。
需要注意的是,建立主键时,SQL Server默认会把主键设置为聚合索引,一定要把他去掉,设置在更有意义的其它字段上,或者压根就不设。

  GUID的好处很多,有:
生成主键简单,可预知。
没有并发时主键重复的烦恼。
防止用户手动更改数据库中的数据,一看到GUID,就都吓回去了。
避免数据库表迁移时的麻烦(用自增型的主键,在表迁移时简直就是灾难)。
避免了基础表更新时外键的级联更新(主要体现在主键业务无关性上)。

欢迎大家多提意见。


  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-81348-1-1.html 上篇帖子: 从SQL Server 2000/2005到SQL Server 2008的升级测试 下篇帖子: 《Microsoft SQL Server 2008 Analysis Services Step by Step》学习笔记七:高级维度设计
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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