SQL-Oracle10数据库设计范式

2024-09-05 11:18

本文主要是介绍SQL-Oracle10数据库设计范式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

数据库设计范式工具 PowerDesigner

 

  数据库范式非常重要,但从实际开发来看,如果真的全部按照范式去做,则
这个程序没法写,包括查询语句也会变得复杂。
  在Oracle中的scott用户的全部表,实际上就已经很好的体现了一种设计思路,
雇员-部门的关系。

  第一范式:
   
    数据库表中的字段都是单一属性的,不可再分。这个单一属性由其基本类型构成,
包括整型、实数、字符型、逻辑型、日期型等。


插入以下测试数据:
INSERT INTO person(pid,name,info) VALUES (1111,'张三','1983-11-23出生,现在的住址是朝阳区');

实际上对于人员的信息来看,由以下几部分组成:
 生日:1983年11月23日
 省市:北京
 地区:西城区
 详细地址:


第一范式:每个字段不可再分,所以以上脚本可以修改为:
CREATE TABLE person(
 pid NUMBER(4) PRIMARY KEY NOT NULL,
 name VARCHAR2(50),
 birthday DATE,
 area VARCHAR2(200),
 subarea VARCHAR2(200),
 address VARCHAR2(200)
) ;

注意点:
 将姓名拆分成姓和名,这样的拆分无意义。要保证每个列有意义。

 


第二范式:

 数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖
(部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况),
也即所有非关键字段都完全依赖于任意一组候选关键字。
 


 当满足第一范式时,还有可能存在的问题是,数据库表中部分内容冗余。

使用第二范式:
  学生应该是一个实体表的信息
CREATE TABLE student(
 stuno VARCHAR2(50) PRIMARY KEY NOT NULL,
 stuname VARCHAR2(50) ,
 stuage NUMBER
) ;

CREATE TABLE course(
 cid NUMBER(5) PRIMARY KEY NOT NULL,
 cname VARCHAR2(50) ,
 credit NUMBER
) ;

CREATE TABLE selectcourse(
 stuno VARCHAR2(50),
 cid NUMBER(5),
 grade NUMBER
 加入外键关联,因为学生没了,成绩就没了,因为课程没了,成绩也没了。
) ;

 

 

INSERT INTO  student(stuno,stuname,stuage)VALUES ('s001','张三','20') ;
INSERT INTO  student(stuno,stuname,stuage)VALUES ('s002','李四','20') ;
INSERT INTO  student(stuno,stuname,stuage)VALUES ('s003','王五','20') ;

INSERT INTO  course(cid,cname,credit)VALUES ('ca','JAVA',3) ;
INSERT INTO  course(cid,cname,credit)VALUES ('cb','Oracle',5) ;


INSERT INTO selectcourse(stuno,cid,grade) VALUES ('s001','ca',79.0)
INSERT INTO selectcourse(stuno,cid,grade) VALUES ('s001','ca',77.0)
INSERT INTO selectcourse(stuno,cid,grade) VALUES ('s001','ca',77.0)


以上设计解决了问题:
 学生不选课的时候,课程信息不会消失
 更新课程的时候直接更新课程表即可
 所有的关联关系在关系表中体现。
也就是说现在完成了一个多对多的关系。

 

 

第三范式

  第三范式在实际开发中用的频率最多。
 
 

  例如,要求设计一张学生表,包含学号、姓名、年龄、所在院校、学院地址、
学院电话,此时肯定不能使用第一范式,但是现在如果使用的是第二范式呢?
 
CREATE TABLE student(
 stuno VARCHAR2(50) PRIMARY KEY NOT NULL,
 stuname VARCHAR2(50) ,
 stuage NUMBER
) ;

CREATE TABLE college(
 cid NUMBER(4) PRIMARY KEY NOT NULL,
 cname VARCHAR2(50) NOT NULL ,
 caddress VARCHAR2(200) NOT NULL ,
 ctel VARCHAR2(200) NOT NULL
) ;

CREATE TABLE studentcollage(
 ctuno VARCHAR2(50) ,
 cid NUMBER(4) ,
 设置主-外键关系
) ;


  按照这种设计,一个学生可以同时在多个学生可以在多个学院同时上课,
多个学院会同时有同一个学生在上课。

 此时,最好是:一个学院包含多个学生,一个学生属于一个学院。
实际上,此设计就完全类似于部门和雇员表的设计结构。

 

 

 

CREATE TABLE student(
 stuno VARCHAR2(50) PRIMARY KEY NOT NULL,
 stuname VARCHAR2(50) ,
 stuage NUMBER ,
 cid BUMBER(4) ,
 建立主-外键关联
) ;
  是一个很明确的一对多的关系设计。
 
 


以上的三个范式只能算是参考,如果真的按照此种方式设计数据库,则有够累,
数据库设计的唯一原则:
        ·数据库表的关联查询越少越好,sql语句的复杂度越低越好。

这篇关于SQL-Oracle10数据库设计范式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1138803

相关文章

MySQL MCP 服务器安装配置最佳实践

《MySQLMCP服务器安装配置最佳实践》本文介绍MySQLMCP服务器的安装配置方法,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下... 目录mysql MCP 服务器安装配置指南简介功能特点安装方法数据库配置使用MCP Inspector进行调试开发指

mysql中insert into的基本用法和一些示例

《mysql中insertinto的基本用法和一些示例》INSERTINTO用于向MySQL表插入新行,支持单行/多行及部分列插入,下面给大家介绍mysql中insertinto的基本用法和一些示例... 目录基本语法插入单行数据插入多行数据插入部分列的数据插入默认值注意事项在mysql中,INSERT I

一文详解MySQL如何设置自动备份任务

《一文详解MySQL如何设置自动备份任务》设置自动备份任务可以确保你的数据库定期备份,防止数据丢失,下面我们就来详细介绍一下如何使用Bash脚本和Cron任务在Linux系统上设置MySQL数据库的自... 目录1. 编写备份脚本1.1 创建并编辑备份脚本1.2 给予脚本执行权限2. 设置 Cron 任务2

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名

SQL Server数据库死锁处理超详细攻略

《SQLServer数据库死锁处理超详细攻略》SQLServer作为主流数据库管理系统,在高并发场景下可能面临死锁问题,影响系统性能和稳定性,这篇文章主要给大家介绍了关于SQLServer数据库死... 目录一、引言二、查询 Sqlserver 中造成死锁的 SPID三、用内置函数查询执行信息1. sp_w

canal实现mysql数据同步的详细过程

《canal实现mysql数据同步的详细过程》:本文主要介绍canal实现mysql数据同步的详细过程,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的... 目录1、canal下载2、mysql同步用户创建和授权3、canal admin安装和启动4、canal

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

MySQL存储过程之循环遍历查询的结果集详解

《MySQL存储过程之循环遍历查询的结果集详解》:本文主要介绍MySQL存储过程之循环遍历查询的结果集,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言1. 表结构2. 存储过程3. 关于存储过程的SQL补充总结前言近来碰到这样一个问题:在生产上导入的数据发现

MySQL 衍生表(Derived Tables)的使用

《MySQL衍生表(DerivedTables)的使用》本文主要介绍了MySQL衍生表(DerivedTables)的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学... 目录一、衍生表简介1.1 衍生表基本用法1.2 自定义列名1.3 衍生表的局限在SQL的查询语句select

MySQL 横向衍生表(Lateral Derived Tables)的实现

《MySQL横向衍生表(LateralDerivedTables)的实现》横向衍生表适用于在需要通过子查询获取中间结果集的场景,相对于普通衍生表,横向衍生表可以引用在其之前出现过的表名,本文就来... 目录一、横向衍生表用法示例1.1 用法示例1.2 使用建议前面我们介绍过mysql中的衍生表(From子句