首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

【系统架构设计师】数据库系统 ④ ( 关系模型 | 数据模型 三要素 | 数据模型 种类 | 关系模型 的 表示形式 | 关系模型相关概念 | 完整性约束 | 触发器 )

  • 25-04-24 18:47
  • 2134
  • 6563
blog.csdn.net

文章目录

  • 一、数据模型
    • 1、数据模型 三要素
    • 2、数据模型 种类
  • 二、关系模型
    • 1、关系模型 的 表示形式
    • 2、关系模型 的 相关概念
    • 3、关系模型 的 完整性约束
    • 4、关系模型 触发器





一、数据模型




1、数据模型 三要素


数据模型 : 数据模型 是 抽象描述 数据、数据间关系、约束条件 及 操作规则 的框架 , 用于 定义数据库 如何组织、存储 和 管理数据 , 数据模型 核心三要素如下 :

  • 数据结构 ( 静态组织形式 | 决定数据如何存储 ) : 用于描述 数据 的 组织形式、存储结构 及 数据间的逻辑关系 , 是 数据模型 的 骨架 , 是 数据操作 和 数据约束条件 的基础 ;
  • 数据操作 ( 动态行为 | 提供数据处理能力 ) : 对数据进行的 增删改查 等操作 , 以及操作规则 ;
  • 数据约束 ( 完整性规则 | 保障数据质量 ) : 限制 数据取值范围 及 关联关系 的规则 , 确保数据 有效性 和 一致性 ;

2、数据模型 种类


数据模型 有如下种类 :

  • 层次模型 : 树状结构 , 父节点 有 多个子节点 , 子节点只有 唯一的父节点 ;
  • 网状模型 : 图状结构 , 父节点 有 多个子节点 , 子节点可以有 多个父节点 ;
  • 面向对象模型 : 以对象为单位 , 组织的数据模型 ;
  • 关系模型 ( 软考重点 ) : 二维表结构 , 行表示记录 , 列表示属性 , 关系模型 的 基本结构 只记录 关系模式名称 和 相应的属性 ;
  • 非关系模型 : NOSQL 模型 , 灵活的数据组织形式 , 适用于大数据、高并发场景 , 牺牲部分一致性 , 追求高扩展性 ;




二、关系模型




1、关系模型 的 表示形式


关系模型 的 表示形式 :

  • 关系名称 + 属性集合形式 : 格式 关系名称 ( 属性 1 , 属性 2 , ... , 属性 n ) , 下面是一个关系模型 , 学生 是 关系名称 , 姓名和年龄 是 关系的属性 ;
学生 ( 学号 , 姓名 , 年龄 , 班级编号 )
  • 1
  • UF二元组形式 : 格式 关系名称 ( UF 二元组 ) , 下面的关系模型中 , U 集合是 属性集合 , F 集合是 依赖集合 , 箭头 −> 表示属性间的依赖关系 ;
学生 ( U , F )
U = {学号 , 姓名 , 年龄 , 班级编号}
F = {学号 -> 姓名 , 学号 -> 年龄 , 学号 -> 班级编号}
  • 1
  • 2
  • 3
  • 二维表 : 关系模型 是 典型的 二维表 结构 , 每个 关系模型 对应一张 二维表 , 如 : 学生 ( 学号 , 姓名 , 年龄 , 班级编号 ) 关系模型 对应的 二维表 如下图所示 , 表名 是 " 学生 " , 学生的 各个属性 对应的就是 " 列名 " , 每个学生实例 对应着 二维表 的一行数据记录 ;
    • 属性 ( 列 ) : 描述数据的特征 , 如 : 学号 , 姓名 ;
    • 元组 ( 行 ) : 表示具体数据记录 ;
    • 主键 : 唯一标识 元组 的属性 ;
    • 外键 : 建立 表间关联的约束 ;
      在这里插入图片描述

UF 二元组 形式 是理论层面的抽象表示 , 属性集合 形式 是 UF 的简化表达 , 二维表 形式 是物理存储的直观呈现 ;


2、关系模型 的 相关概念


关系模型 的 相关概念 :

  • 目 : 又称为 " 度 " , 关系模型 中 的 属性个数 ;
    • 学生表 关系模型 学生 ( 学号 , 姓名 , 年龄 , 班级编号 ) 的 目或度 为 4 ;
  • 候选键 : 又称为 " 候选码 " , 能 唯一标识元组 且 无冗余 的 最小属性集合 , 唯一标识元组 具有唯一性 , 没有冗余 说明 属性集合要极尽可能精简 , 属性集合 中 可以包含一个属性 也可以包含多个属性 ;
    • 唯一性 : 确保每个元组唯一 ;
      • 在 国家管理 中 , 使用 身份证号 可以唯一标识一个人 ;
      • 在 班级管理 中 , 使用 学号 可以唯一标识一个人 , 在 学生 ( 学号 , 姓名 , 年龄 , 班级编号 ) 关系中 , 学号 可以唯一标识一个学生 , 学号 就是 候选键 ;
    • 最小性 ( 避免候选键冗余 ) : 删除 候选键 属性集合 中 的 任意属性后无法保持唯一性 , 本来 学号 已经可以唯一标识一个学生 , 但是候选键集合设置为 {学号 , 姓名} , 显然 姓名 属性 就是冗余的 ;
    • 多个候选键 : 如果关系是 学生 ( 学号 , 身份证号 , 姓名 , 年龄 , 班级编号 ) , 学号 和 身份证号 都可以唯一标识一个学生 , 那么该关系有两个候选键 , 分别是 {学号} 和 {身份证号} , 可以选择其中一个作为 主键 ( 主码 ) ;
    • 候选键有多个属性 : 选课 的关系模型中 , 一个 选课 模型 需要由 学号、课程号 两个属性确定 , 候选键为 {学号 , 课程号} , 这两个属性种单个无法唯一确定一条选课数据 , 一个学号可能选择了多个课程 , 一个课程号可能有多个学生选择 ;
  • 主键 : 又称为 " 主码 " , 从 多个 候选键 中 , 任选一个 候选键 作为 主键 ;
  • 主属性 : 出现在 候选键 中的属性 是 主属性 ; 在 学生 ( 学号 , 姓名 , 年龄 , 班级编号 ) 关系中 学号 是 主属性 ;
  • 非主属性 : 候选键 之外的属性 是 非主属性 ; 在 学生 ( 学号 , 姓名 , 年龄 , 班级编号 ) 关系中 " 姓名、年龄、班级编号 " 是 非主属性 ;
  • 外键 : 又称为 " 外码 " , 引用 其他关系 主键 的属性 , 用于 维护 表间关联 ; 如 : 选课 关系中 , 候选键为 {学号 , 课程号} , 学号 是 学生关系 的 主键 , 课程号 是 课程表 的主键 , 学号 来自其它表 是外键 ;
  • 全码 : 关系模型 中 所有属性组 所有属性 共同组成 候选键 , 即 无冗余属性 , 所有属性 都是该关系的 候选码 ;

3、关系模型 的 完整性约束


完整性约束 : 完整性约束 是为了 确保 数据库 修改、插入 数据时 , 不会破坏数据的一致性 , 防止数据被意外破坏 ; 完整性约束可以分为以下三类 :

  • 实体完整性约束 : 主键 不重复 , 且 不为空 , 目的是 保证每个 实体 ( 表中的一行 ) 能被唯一标识 ;
    • 规则案例 : 学号 唯一且非空 ; 不能插入 重复学号 的 学生实体 ;
  • 参照完整性约束 : 关系 与 关系之间的引用 ; 外键 只有两种情况 : 要么是 其它关系的 主键 , 要么 是 空值 ; 作用是 维护表与表之间的引用关系 ;
    • 规则案例 : 选课表的 学号 必须存在于学生表 ; 选课 实例 引用的 学生的学号 必须存在 , 引用的 课程的课程号 必须存在 ;
  • 自定义完整性约束 : 用户 根据 业务需求 制定的规则 , 通常通过 检查约束 实现 , 确保数据符合实际业务逻辑 ;
    • 规则案例 : 自定义规则 年龄 > 0,成绩 BETWEEN 0 AND 100 , 如果 输入 年龄=-5 或 成绩=120 则不符合自定义规则要求 ;

4、关系模型 触发器


触发器 : 是数据库中的一种 特殊存储过程 , 它 在 特定 数据库事件 ( 增、删、改 ) 发生时自动触发执行 , 用于实现复杂的业务逻辑或数据约束 ;

  • 触发事件 : INSERT、UPDATE、DELETE。
  • 触发时机 :
    • BEFORE : 事件执行前触发 , 如 : 数据合法性检查 ;
    • AFTER : 事件执行后触发 , 如 : 记录操作日志 ;
  • 触发条件 ( 可选 ) : 通过WHEN子句限定执行逻辑 ;
  • 操作逻辑 : 触发器具体执行的 SQL 语句或业务逻辑 ;

触发器 示例 : 在插入订单前检查库存是否充足 ;

CREATE TRIGGER check_stock BEFORE INSERT ON orders
FOR EACH ROW
WHEN (NEW.quantity > (SELECT stock FROM products WHERE id = NEW.product_id))
BEGIN
    RAISE_ERROR '库存不足';
END;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
注:本文转载自blog.csdn.net的韩曙亮的文章"https://hanshuliang.blog.csdn.net/article/details/146562923"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top