数据库表关联映射

数据表之间的关联关系分为3种:一对一,一对多,多对多.

一对一

 是将数据表垂直切分,其实是不常见的,或不常用的.也就是A表的一条记录对应B表的一条记录, 例如:一个系统必然有员工表(包含字段:EmployeeId、姓名、性别、年龄、电话、地址等),每个员工都为一个用户,所以还有张 User 表(包含字段:UserId(关联 EmployeeId)、用户名、密码、角色等),这样你会发现,整合为一张表是否不太妥当?因为,User 的记录只会在登录时用到,感觉有点违背三大范式中的“确保每列都和主键列直接关联,而不是间接关联”。
 还有种情况,这就要根据具体的业务来决定了。如果,当一张表的字段过于太多,而很多字段可能只有在某些情况下,才会使用到,这时也可以考虑使用一对一设计。

优点

  1. 便于管理、可提高一定的查询速度

  2. 减轻 CPU 的 IO 读写,提高存取效率。

  3. 符合数据库设计的三大范式。

  4. 符合关系性数据库的特性。

Ø 缺点

  1. 增加一定的复杂程度,程序中的读写难度加大。

一对多

  是最常见的设计,就是A表的一条记录,对应B表的多条记录,且A的主键作为B表的外键这主要看以哪张表为中心,以上示例以 A 表为中心,就是一对多,如果以 B 表为中心,则是多对一。举几个例子:
  1. 班级表 与 学生表,一个班级对应多个学生,或者多个学生对应一个班级。

  2. 角色表 与 用户表,一个角色对应多个用户,或者多个用户对应一个角色。

  3. 商品表 与 图片表,一个商品对应多张图片,或者多张图片对应一个商品。

  4. 多对多

Ø 多对多,在数据库中也比较常见,可以理解为是一对多和多对一的组合。要实现多对多,一般都需要有一张中间表(也叫关联表),将两张表进行关联,形成多对多的形式。例如:

  1. 老师表、班级表、科目表,中间表为:课程表
  1. SQL:

–教师表

CREATE TABLE #Teacher(TeacherId int, Name nvarchar(20));

INSERT INTO #Teacher VALUES(1, ‘张老师’), (2, ‘王老师’);

–班级表

CREATE TABLE #Class(ClassId int, Name nvarchar(20));

INSERT INTO #Class VALUES(1, ‘一班’), (2, ‘二班’);

–课程表(关联表)

CREATE TABLE #Courses(CoursesId int IDENTITY(1, 1), TeacherId int, ClassId int, Name nvarchar(20));

INSERT INTO #Courses VALUES(1, 1, ‘语文’), (1, 2, ‘语文’);

INSERT INTO #Courses VALUES(2, 1, ‘数学’), (2, 2, ‘英语’);

SELECT T1.TeacherId, T2.Name, T1.ClassId, T3.Name, T1.Name FROM #Courses AS T1, #Teacher AS T2, #Class AS T3

WHERE T1.TeacherId=T2.TeacherId AND T1.ClassId=T3.ClassId

DROP TABLE #Teacher, #Class, #Courses;

在这里插入图片描述

转: https://www.cnblogs.com/abeam/p/7406285.html

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值