设为首页 加入收藏

TOP

数据库范式通俗理解,谈谈数据库设计(一)
2014-11-24 07:13:43 来源: 作者: 【 】 浏览:8
Tags:数据库 范式 通俗 理解 谈谈 设计

数据库范式通俗理解,谈谈 数据库设计
第一范式:
  说白了即识别出业务中的对象,为每个对象定义一个数据库表。
  比如拿学校模型举例。老师信息表,学生信息表,班级信息表...。每个表都有一个ID做为主键,其他字段记录着该对象的基本信息。 www.2cto.com
1 老师表(School_TeacherTab)
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'School_TeacherTab')
DROP TABLE School_TeacherTab
CREATE TABLE dbo.School_TeacherTab(
School_TeacherTabID INT IDENTITY NOT NULL PRIMARY KEY NONCLUSTERED,
School_TeacherName VARCHAR(100) NOT NULL DEFAULT ''
);
2 学生表(School_StudentTab)
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'School_StudentTab')
DROP TABLE School_StudentTab www.2cto.com
CREATE TABLE dbo.School_StudentTab(
School_StudentTabID INT IDENTITY NOT NULL PRIMARY KEY NONCLUSTERED,
School_StudentName VARCHAR(100) NOT NULL DEFAULT ''
);
第二范式:
讲述的是表与表之间的关系。
常见的表之间的关系,是一对多(多对一,反过来看)关系。
比如,一个老师可以教多个学生,一个学生只能有一个老师。比如,武林门派,一派掌门可以收很多弟子,但是一个人不能参加两个以上门派。这样限定的话,上面的学生表要修改为:
2 学生表(School_StudentTab)
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'School_StudentTab')
DROP TABLE School_StudentTab
CREATE TABLE dbo.School_StudentTab(
School_StudentTabID INT IDENTITY NOT NULL PRIMARY KEY NONCLUSTERED,
School_TeacherTabID INT NOT NULL FOREIGN KEY REFERENCES School_TeacherTab(School_TeacherTabID),
School_StudentName VARCHAR(100) NOT NULL DEFAULT ''
);
上面的表定义,表示不同的School_StudentTabID,可以有相同的School_TeacherTabID,这样即表示出来学生和老师之间的多对一关系。
有时候一个表不只和另外一个表有关系,可能和另外多个表有关系。假设限定,每个弟子都只会使一门兵器,不同的弟子可能练的是同一门兵器。同样学生和使用兵器是多对一关系。
3 兵器表(School_WeaponTab) www.2cto.com
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'School_WeaponTab')
DROP TABLE School_WeaponTab
CREATE TABLE dbo.School_WeaponTab(
School_WeaponTabID INT IDENTITY NOT NULL PRIMARY KEY NONCLUSTERED,
School_WeaponName VARCHAR(100) NOT NULL DEFAULT ''
);
学生表就变成了如下的形式:
2 学生表(School_StudentTab)
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'School_StudentTab')
DROP TABLE School_StudentTab
CREATE TABLE dbo.School_StudentTab(
School_StudentTabID INT IDENTITY NOT NULL PRIMARY KEY NONCLUSTERED,
School_TeacherTabID INT NOT NULL FOREIGN KEY REFERENCES School_TeacherTab(School_TeacherTabID),
School_WeaponTabID INT NOT NULL FOREIGN KEY REFERENCES School_WeaponTab(School_WeaponTabID),
School_StudentName VARCHAR(100) NOT NULL DEFAULT ''
);
第一范式,要求我们识别出弟子,老师,兵器这些对象,将它们分别定义成一个个表,如果上面的学生表里,保存的不是兵器表id,而是直接的兵器名称,就违反了第一范式。
多对对关系: www.2cto.com
假设学生和老师之间的关系是多对多的关系,比如郭靖既拜柯镇恶为师,又拜洪七公为师;而洪七公除了郭靖,还收黄蓉为弟子。
这种情况下,我们既不能在老师表里加学生外键,也不能在学生表里加老师外键。而是要新建立一张老师_学生关系表,这种表不同于上面的对象表(描述对象信息),它描述的是对象间的关系。
4 老师_学生表(School_TeacherStudentTab)
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'School_TeacherStudentTab')
DROP TABLE School_TeacherStudentTab
CREATE TABLE dbo.School_TeacherStudentTab(
School_TeacherStudentTabID INT IDENTITY NOT NULL PRIMARY KEY NONCLUSTERED,
School_TeacherTabID INT NOT NULL FOREIGN KEY REFERENCES School_TeacherTab(School_TeacherTabID),
School_StudentTabID INT NOT NULL FOREIGN KEY REFERENCES School_StudentTab(
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇关系数据库的范式理论 下一篇数据库三范式(下)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Redis 分布式锁全解 (2025-12-25 17:19:51)
·SpringBoot 整合 Red (2025-12-25 17:19:48)
·MongoDB 索引 - 菜鸟 (2025-12-25 17:19:45)
·What Is Linux (2025-12-25 16:57:17)
·Linux小白必备:超全 (2025-12-25 16:57:14)