Design4:数据库设计规范
当数据模型从概念层转到逻辑层时,需要进行规范化设计。要想设计一个结构合理的关系型数据库,至少需要满足1NF,2NF,3NF,即第一范式,第二范式,第三范式。
1,1NF(原子性)
1NF是最基本的,数据库表的每一列都是不可分割的原子数据项。
不可分割是相对而言的,依据实际需求来界定。
严格的说,某些TSQL的系统数据类型违反1NF,例如DateTime类型,包含了year,month,day,hour,minute,second,millisecond,但是我们更希望这些属性组合在一起,标识事情发生的具体时间点。
1NF提供了一种规范,优秀的设计模型,例如 姓名(full name)包含两部分,姓氏和名字,如果应用程序不会分别获取姓氏或名字,可以将full name视为原子数据项,但是,如果程序需要获取姓氏或名字,那么将full name拆分,划分为两列(surname 和 name)是更好的设计模型。
2,2NF(属性完全依赖于主键)
表中的所有列,都必须完全依赖于主键,由主键唯一标识所有属性列,对于不完全依赖于主键的列,会出现数据冗余,需要拆分成表。
例如以下是个成绩表,各个字段的含义是 Cid(course id),Cname(course name),stuid(student id),stuname(student name),主键是cid和stuid,但是cname,stuname,professionid和professionname并不完全依赖于主键,cname完全依赖于CID,stuname,professionid和professionname完全依赖于stuid。
按照2NF的要求,将依赖于主键属性的所有属性集中到一个表中,上图数据能拆分成三个表,dbo.student,dbo.course,dbo.score,消除数据的冗余。
表是属性的集合,一个表是一个实体,例如student表,有学号,name,profession属性,学号是主键属性,能唯一标识一个student实体,能够根据学号唯一确定一位学生的name,profession属性。
create table dbo.student
(
stuid int not null primary key,
stuname varchar(100) not null,
professionid int ,
professionname varchar(100)
) create table dbo.course
(
cid int not null primary key,
cname varchar(100) not null
) create table dbo.score
(
cid int not null foreign key references dbo.course(cid),
stuid int not null foreign key references dbo.student(stuid),
score int null
primary key(cid,stuid)
)
3,3NF(属性不能传递依赖于主属性,即属性不依赖于其它非主键属性)
如果某一属性A依赖于非主键属性B,而非主键属性B依赖于主键pk,那么属性A就是间接依赖于主键pk,这被称作传递依赖于主属性。
例如,ProfessioName 是专业名称,每一个专业的名称是唯一的,跟学生没有关系,ProfessioName依赖于ProfessionID,而ProfessionID完全依赖于stuid,因为student表的属性是由stuid唯一标识的,所以ProfessioName传递依赖于stuid。
对传递依赖进行范化,需要将传递依赖的属性拆分成表,例如
create table dbo.profession
(
professionid int not null primary key,
professionname varchar(100)
)
create table dbo.student
(
stuid int not null primary key,
stuname varchar(100) not null,
professionid int foreign key references dbo.profession(professionid)
)
Design4:数据库设计规范的更多相关文章
- SQL Server数据库设计规范
数据库设计规范 1.简介 数据库设计是指对一个给定的应用环境,构造最优的数据库模式,建立数据库及其他应用系统,使之能有效地存储数据,满足各种用户的需求.数据库设计过程中命名规范很是重要,命名规范合理的 ...
- SQL Server 数据库设计规范
数据库设计规范 1.简介 数据库设计是指对一个给定的应用环境,构造最优的数据库模式,建立数据库及其他应用系统,使之能有效地存储数据,满足各种用户的需求.数据库设计过程中命名规范很是重要,命名规范合理的 ...
- 解析大型.NET ERP系统 20条数据库设计规范
数据库设计规范是个技术含量相对低的话题,只需要对标准和规范的坚持即可做到.当系统越来越庞大,严格控制数据库的设计人员,并且有一份规范书供执行参考.在程序框架中,也有一份强制性的约定,当不遵守规范时报错 ...
- MYSQL数据库设计规范与原则
MYSQL数据库设计规范 1.数据库命名规范 采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线'_'组成; 命名简洁明确(长度不能超过30个字符); 例如:user, stat ...
- 【转】MYSQL数据库设计规范与原则
转载出:http://www.cnblogs.com/lovekingly/p/5044278.htmlMYSQL数据库设计规范 1.数据库命名规范 采用26个英文字母(区分大小写)和0-9的自然数( ...
- mysql 数据库设计规范
MySQL数据库设计规范 目录 1. 规范背景与目的 2. 设计规范 2.1 数据库设计 2.1.1 库名 2.1.2 表结构 2.1.3 列数据类型优化 2.1.4 索引设计 2.1.5 分库分表. ...
- Oracle数据库设计规范建议
Oracle数据库设计规范建议 1 目的 本规范的主要目的是希望规范数据库设计,尽量提前避免由于数据库设计不当而产生的麻烦:同时好的规范,在执行的时候可以培养出好的习惯,好的习惯是软件质量的很好的保证 ...
- MYSQL数据库设计规范11111
MYSQL数据库设计规范 1.数据库命名规范 采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线'_'组成; 命名简洁明确(长度不能超 ...
- MySQL数据库设计规范
1. 规范背景与目的 MySQL数据库与 Oracle. SQL Server 等数据库相比,有其内核上的优势与劣势.我们在使用MySQL数据库的时候需要遵循一定规范,扬长避短.本规范旨在帮助或指导R ...
随机推荐
- hdu 1394 Minimum Inversion Number(树状数组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题意:给你一个0 — n-1的排列,对于这个排列你可以将第一个元素放到最后一个,问你可能得到的最 ...
- 用户 'IIS APPPOOL\ASP.NET V4.0' 登录失败 解决办法…………
在iis管理器中-->应用程序池-->ASP.NET V4.0---->高级设置-->标识-->改为localSystem
- vi命令模式下快速注释代码的方法
进入http://www.vim.org/scripts/script.php?script_id=1528 点击这个链接下载comments.vim这个插件 然后把它放入到./vim/plugin下 ...
- Usart的单线半双工模式(stm32F10x系列)
这两天折腾CTS/RTS硬件流控,看到说232协议的CTS/RTS只是用来做半双工换向使用的.正好手头上有块stm32的板子,看了看stm32的Usart,竟然发现支持的是单线半双工.232里面毕竟4 ...
- Core Audio(三)
音频终端设备(Audio Endpoint Devices) endpoint device指的是应用程序的数据通道上起始或终止的硬件设备,如扬声器,耳机,话筒等:沿着数据通道可能穿越一定数目的硬件和 ...
- 使用getopt()处理命令行参数
假设有一程序 testopt,其命令行选项参数有: -i 选项 -l 选项 -r 选项 -n <值> 带关联值的选项 则处理 ...
- Sublime Text 3专题
MarkDown语法记笔记 1.下载&&安装 下载 常用插件安装 Submlit使用教程 [如何优雅地使用Sublime Text3] 2.Sublime Text 便捷技巧 [以PH ...
- ASP.NET 上传文件最大值调整
首先,最容易找到的是web.config下面配置: <!--maxRequestLength=50MB--> <httpRuntime targetFramework="4 ...
- js for 循环中的 变量问题。
今日处理项目中的一个循环,本来就是一个小小的for循环,后来发现该段程序出现了问题,仔细检查代码没有发现其中的错误.无奈只好叫来了老大帮忙.通过在模版中断点调试(该方式只能自己写debugger断点) ...
- 人人都是 DBA(XIII)索引信息收集脚本汇编
什么?有个 SQL 执行了 8 秒! 哪里出了问题?臣妾不知道啊,得找 DBA 啊. DBA 人呢?离职了!!擦!!! 程序员在无处寻求帮助时,就得想办法自救,努力让自己变成 "伪 DBA& ...