数据库设计规范(详细)

2023-10-26

数据规范化设计

一、数据规范化

  仅有好的RDBMS并不足以避免数据冗余,必须在数据库的设计中创建好的表结构
Dr E.F.codd 最初定义了规范化的三个级别,范式是具有最小冗余的表结构
这些范式是:
1、第一范式(1st NF -First Normal Fromate)
2、第二范式(2nd NF-Second Normal Fromate)
3、 第三范式(3rd NF- Third Normal Fromate)

第一范式 (1st NF):
在这里插入图片描述
第一范式的目标是确保每列的原子性
如果每列都是不可再分的最小数据单元(也称为最小的原子单元),则满足第一范式(1NF)
 
第二范式 (2nd NF):
在这里插入图片描述
如果一个关系满足1NF,并且除了主键以外的其他列,都依赖与该主键,则满足第二范式(2NF)
第二范式要求每个表只描述一件事情
 
第三范式 (3rd NF):
在这里插入图片描述
如果一个关系满足2NF,并且除了主键以外的其他列都不传递依赖于主键列,则满足第三范式(3NF)

二、规范化实例

假设某建筑公司要设计一个数据库,公司的业务规则概括说明如下:

1、公司承担多个工程项目,每一项工程有:工程号、工程名称、施工人员等
2、公司有多名职工,每一名职工有:职工号、姓名、性别、职务(工程师、技术员)等
3、公司按照工时和小时工资率支付工资,小时工资率由职工的职务决定(例如,技术员的小时工资率与
工程师不同)
4、公司定期制定一个工资报表

如图所示(工资表):
在这里插入图片描述
如图所示(工时表):
在这里插入图片描述
表中包含大量的冗余,可能会导致数据异常:
更新异常 :
------例如,修改职工号=1001的职务,则必须修改所有职工号=1001的行

添加异常:
------若要增加一个新的职工时,首先必须给这名职工分配一个工程。或者为了添加一名新职工的数据,先给这名职工分配一个虚拟的工程。(因为主关键字不能为空)

删除异常:
------例如,1001号职工要辞职,则必须删除所有职工号=1001的数据行。这样的删除操作,很可能丢失了其它有用的数据

采用这种方法设计表的结构,虽然很容易产生工资报表,但是每当一名职工分配一个工程时,都要重复输入大量的数据。这种重复的输入操作,很可能导致数据的不一致性。
 
应用范式规范化设计
一张表描述了多件事情
在这里插入图片描述
应用第二范式规范化
在这里插入图片描述
应用第三范式规范化
在这里插入图片描述

四、规范化和性能的关系

1、为满足某种商业目标,数据库性能比规范化数据库更重要
------通过在给定的表中添加额外的字段,以大量减少需要从中搜索信息所需的时间
------通过在给定的表中插入计算列(如成绩总分),以方便查询

2、进行规范化的同时,还需要综合考虑数据库的性能


请添加图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据库设计规范(详细) 的相关文章

  • 将数字格式设置为缩写数字

    我有一个数据库 其中有一列包含数字格式的值 例如 5 000 for 5k 86 600 for 86 6k 4 100 000 for 4 1m 在浏览器中显示时 它应该显示为 5000 的 5k 86 600 的 86 6k 等 我需要
  • MySQL from_unixtime 在 2038 年 1 月 19 日之后?

    我们将日期存储为 Unix 时间戳 为了允许用户根据时区设置搜索特定日期 我们在查询中转换该时间戳 以确保搜索 2012 05 03 不会找到上一个 下一个的结果日期取决于用户设置的时区 即如果日期存储为2012 05 03 23 00 U
  • MySQL 唯一 id 或组合 id

    我的项目和开发人员计划的结构如下 developer table id developer name etc project table id project name etc developer project table 因为一个开发人
  • MySQL Workbench 连接编码

    在测试一些代码时 我偶然发现了以下 MySQL 错误 Error Code 1267 Illegal mix of collations utf8 general ci IMPLICIT and utf8mb4 general ci COE
  • 我需要异常排序 mysql 结果

    我正在尝试从当前日期开始对结果进行升序排序 这就是我现在使用的 SELECT FROM friends JOIN bdays ON bdays user friends friendname WHERE username userid OR
  • 删除通过 ORM 插入的项目时出现 SQLAlchemy StaleDataError sqlalchemy.orm.exc.StaleDataError

    我遇到一个问题 出现如下错误 MyPyramidApplication Error
  • Sqoop Import --password-file 功能在 sqoop 1.4.4 中无法正常工作

    我使用的是hadoop 1 2 1 sqoop版本是1 4 4 我正在尝试运行以下查询 sqoop import connect jdbc mysql IP 3306 database name table clients target d
  • 如何处理 pcntl_fork(): 错误 35?

    我有 php7 CLI 守护进程 它连续解析文件大小超过 50M 的 json 我试图使用 pcntl fork 的单独进程将每 1000 个解析数据条目保存到 mysql 对于约 200k 行 它工作得很好 然后我得到pcntl fork
  • 在 MySQL 中存储 IPv6 地址

    正如 需要支持 ipv6 的 inet aton 和 inet ntoa 函数 http bugs mysql com bug php id 34037 目前没有用于存储 IPv6 地址的 MySQL 函数 用于存储 插入的推荐数据类型 函
  • mysql 部分索引、反向索引

    我有一张包含单词列表的表格 字 VARCHAR 16 我需要创建一个反向索引 IE 单词 apple 将索引为 elppa 单词 banana 将索引为 ananab 依此类推 另外 是否可以索引单词的一部分 例如 跳过第一个 最后一个或
  • 如何通过python将python字典存储到mysql数据库中

    我试图通过将字典转换为字符串然后尝试插入来将以下字典存储到 mysql DB 中 但出现以下错误 如何解决这个问题 或者有其他方法将字典存储到 mysql DB 中吗 dic office component office Word2010
  • 如何从 netbeans 远程调试 jar

    我正在尝试弄清楚如何调试远程运行的 jar 这是我的场景 我的 jar 将从 VPS 运行 这个jar基本上运行一个服务器 对于游戏 所以它还连接到 mysql 数据库 我使用 3 个 bat 文件启动服务器 如下所示 设置 CLASSPA
  • 使用 php 执行 *.sql 文件

    我需要执行一个 sql 文件 其中大约有 48 个要创建的表 它由注释和以 结尾的sql命令组成 有没有办法运行这些 sql 命令 将它们立即转换为单个字符串 我的意思是我需要使用 php 立即运行整个文件 我可以使用 mysql quer
  • 带有mysql的实体框架,linux和windows之间的表大小写问题

    我们目前正在开发一个使用 Code First Entity Framework 和 Mysql 的产品 开发数据库托管在 Windows 环境中 而生产 mysql 则托管在 Linux 环境中 我遇到的问题是 mysql 中的表命名如下
  • 用于从 PHP 更新实时
  • 的 jQuery 插件
  • 有没有任何 jQuery 插件可以创建类似实时 feed 的东西推特主页 http www twitter com 使用 PHP 它从 MySQL 数据库获取数据 PHP 文件必须如何 Thanks 您确实不需要为此使用插件 您可以使用 j
  • 在列名中使用保留字

    这是一些简单的代码 但我只是不知道为什么我不能使用这个词作为表的实体 CREATE TABLE IF NOT EXISTS users key INT PRIMARY KEY NOT NULL AUTO INCREMENT username
  • 课程完成时更新外部数据库

    我的场景 Moodle 中的用户完成了一门课程 一旦发生这种情况 我想更新外部数据库 我的理解是 每次运行 cron 作业时都会触发 course completed 事件 使用一些简单值 例如已完成课程的用户名 ID 课程 ID 以及完成
  • MySQL ORDER BY rand(),名称 ASC

    我想获取一个包含 1000 个用户的数据库并随机选择 20 个用户 ORDER BY rand LIMIT 20 然后按名称对结果集进行排序 我想出了以下查询not像我希望的那样工作 SELECT FROM users WHERE 1 OR
  • mysql连接3个表

    如何连接三个具有一个公共列 id 的mysql表 例如 从表1中选择a b 从表2中选择c d 从表3中选择e f 其中id x 谢谢 SELECT t1 a t1 b t2 c t2 d t3 e t3 f FROM table1 t1
  • 初学者 MYSQL 错误 - 访问被拒绝

    错误 1045 28000 用户 root localhost 的访问被拒绝 使用密码 N 哦 我已经尝试了一切 我已经阅读了一页又一页的答案 但似乎没有人知道正确的答案 当我尝试登录我的数据库时 我只是收到上述错误 我还没有设置密码或其他

随机推荐

  • Robotium学习笔记三

    以下是从网络上抄录的一些Robotium注意事项 1 有些button没有string 没有text 只能通过index来click这样很不直观 而且button的index并不是固定的 有可能随着控件重新加载 顺序也有可能发生变化 无法保
  • 获取jsp各种参数方法总结

    package coreservlets import java io import javax servlet import javax servlet http import java util Creates a table show
  • C++学习(五十四)qt发布mac程序

    当你用Qt开发好程序后 是不是会很期待将你的成果分享给你的小伙伴 可是Qt的库并不是OS X标配的 所以我们要自己去复制库到app包里 才可以让app在其他未安装Qt的电脑上运行 比较幸运的是 Qt为我们提供了macdeployqt工具 借
  • 端到端深度学习与自动驾驶(含参考文献)

    参考文献见最后 1 自动驾驶系统的分类 Rule based system基于规则的系统 也有论文中将这样的方法叫做Mediated percepiton approach Fully end to end 端到端的系统 也有论文中叫做be
  • IT产业的70:20:10规律

    IT产业的发展是迅速而无法抗拒的 一家技术优秀 管理正规的互联网公司从奠基到上市往往只需要很少的时间 例如英特尔和微软从上市起用了十年的时间确立了它们在微机领域的霸主地位 并达到百亿产值 而思科上市后只用了五年左右的时间就主导了网络硬件的市
  • day39 动态规划

    62 不同路径 机器人每次只可以向右 或者 向下 每次向右走 dp i 0 1 dp 0 j 1 dp i j dp i 1 j dp i j 1 i的范围 0 m 1 j的范围 0 n 1 63 不同路径 II 解法同上 需要考虑障碍物
  • MQTT 官方资源地址

    MQTT官方资源地址 http mqtt org MQTT的官方地址 https www eclipse org paho downloads php MQTT源码的下载地址 官网源码 请参见官方资料和源代码 以免少走弯路 陷入大坑
  • 数据挖掘技术-绘制饼图

    绘制饼图 前置步骤 准备数据guomin npz 下载数据guomin npz到Linux本地的 course DataAnalyze data目录 绘制饼图 pyplot中绘制饼图的函数为pie 使用pie函数绘制2017年第一季度各产业
  • oracle表的storage参数说明

    author skatetime 2009 05 12 修改表的存储参数 storage 解釋 pctfree和pctused 用來控制數據塊中的空閑空間的使用 空閑空間用於數據行的插入和更新 initrans和maxtrans 用來控制分
  • Netty和Tomcat的区别

    一 Netty和Tomcat有什么区别 Netty和Tomcat最大的区别就在于通信协议 Tomcat是基于Http协议的 他的实质是一个基于http协议的web容器 但是Netty不一样 他能通过编程自定义各种协议 因为netty能够通过
  • GIT简单介绍及常用命令

    git是什么 git是目前企业使用最多最流行的 分布式版本 控制系统 分布式版本控制系统 没有中央服务器 每个人的电脑就是一个完整的版本库 工作时候不需要联网 因为版本就在自己的电脑上面 如果多人同时编写修改一个文件的时候 只需要将两者之间
  • matlab快捷键自动对齐

    matlab用了一段时间发现移动代码的时候很容易出现对不齐的情况 一行行缩进很让人头疼 后面发现原来可以自动缩进 方法如下 matlab中全选某段代码 Ctrl i 可以代码自动排版
  • esh的snapshot快照备份

    1 Elasticsearch的snapshot快照备份 优点 通过snapshot拍摄快照 然后定义快照备份策略 能够实现快照自动化存储 可以定义各种策略来满足自己不同的备份 缺点 还原不够灵活 拍摄快照进行备份很快 但是还原的时候没办法
  • 乐蜂网服务器信息,乐蜂网目标独立上市 唯品会向其派驻CEO、CFO

    腾讯科技讯 王可心 2月25日消息 在乐蜂网 今日 唯品会副总裁冯佳路 乐蜂网副总裁辛益华接受媒体采访 解答外界疑问 控股乐蜂网后 为何又参股东方风行集团 在过去10天 唯品会与乐蜂网 东方风行集团分别发生交易 2月14日 唯品会宣布战略投
  • 爬虫的工作原理、挑战和应用

    什么是网络爬虫 网络爬虫 Web Crawler 是一种自动化程序 它能够在互联网上浏览网页 收集信息并将其存储在本地或其他地方供进一步处理和分析 爬虫通常用于搜索引擎 数据挖掘 内容聚合 价格比较等应用中 爬虫的工作原理 发送请求 爬虫从
  • Node.js 全网最详细教程(第三章:Node.js 文件系统模块)

    fs 文件系统模块 fs 模块是Node js 官方提供的 用来操作文件的模块 它提供了一系列的方法和属性 用来满足用户对文件的操作需求 一 fs readFile 异步读取文件 源码解析 参数1 path 读取的路径 参数2 option
  • ProGuard 进阶系列(二)配置解析

    书接上文 从开源库中把代码下载到本地后 就可以在 IDE 中进行运行了 从 main 方法入手 可以看到 ProGuard 执行的第一步就是去解析参数 本文的内容主要分析源码中我们配置的规则解析的实现 在上一篇文章末尾 在 IDE 中 添加
  • WARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connec

    WARNING Retrying Retry total 0 connect None read None redirect None status None after connection broken by SSLError SSLE
  • C语言函数不定参数实现方式

    函数如何实现不定参数 由于在C语言中没有函数重载 解决不定数目函数参数问题变得比较麻烦 即使采用C 如果参数个数不能确定 也很难采用函数重载 对这种情况 提出了指针参数来解决问题 1 va list 定义了一个指针arg ptr 用于指示可
  • 数据库设计规范(详细)

    数据规范化设计 一 数据规范化 仅有好的RDBMS并不足以避免数据冗余 必须在数据库的设计中创建好的表结构 Dr E F codd 最初定义了规范化的三个级别 范式是具有最小冗余的表结构 这些范式是 1 第一范式 1st NF First