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的JDBC编程详解

《MySQL的JDBC编程详解》:本文主要介绍MySQL的JDBC编程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、前置知识1. 引入依赖2. 认识 url二、JDBC 操作流程1. JDBC 的写操作2. JDBC 的读操作总结前言本文介绍了mysq

java.sql.SQLTransientConnectionException连接超时异常原因及解决方案

《java.sql.SQLTransientConnectionException连接超时异常原因及解决方案》:本文主要介绍java.sql.SQLTransientConnectionExcep... 目录一、引言二、异常信息分析三、可能的原因3.1 连接池配置不合理3.2 数据库负载过高3.3 连接泄漏

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

如何通过try-catch判断数据库唯一键字段是否重复

《如何通过try-catch判断数据库唯一键字段是否重复》在MyBatis+MySQL中,通过try-catch捕获唯一约束异常可避免重复数据查询,优点是减少数据库交互、提升并发安全,缺点是异常处理开... 目录1、原理2、怎么理解“异常走的是数据库错误路径,开销比普通逻辑分支稍高”?1. 普通逻辑分支 v

MySQL中On duplicate key update的实现示例

《MySQL中Onduplicatekeyupdate的实现示例》ONDUPLICATEKEYUPDATE是一种MySQL的语法,它在插入新数据时,如果遇到唯一键冲突,则会执行更新操作,而不是抛... 目录1/ ON DUPLICATE KEY UPDATE的简介2/ ON DUPLICATE KEY UP

MySQL分库分表的实践示例

《MySQL分库分表的实践示例》MySQL分库分表适用于数据量大或并发压力高的场景,核心技术包括水平/垂直分片和分库,需应对分布式事务、跨库查询等挑战,通过中间件和解决方案实现,最佳实践为合理策略、备... 目录一、分库分表的触发条件1.1 数据量阈值1.2 并发压力二、分库分表的核心技术模块2.1 水平分

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1

使用shardingsphere实现mysql数据库分片方式

《使用shardingsphere实现mysql数据库分片方式》本文介绍如何使用ShardingSphere-JDBC在SpringBoot中实现MySQL水平分库,涵盖分片策略、路由算法及零侵入配置... 目录一、ShardingSphere 简介1.1 对比1.2 核心概念1.3 Sharding-Sp

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据

Mac电脑如何通过 IntelliJ IDEA 远程连接 MySQL

《Mac电脑如何通过IntelliJIDEA远程连接MySQL》本文详解Mac通过IntelliJIDEA远程连接MySQL的步骤,本文通过图文并茂的形式给大家介绍的非常详细,感兴趣的朋友跟... 目录MAC电脑通过 IntelliJ IDEA 远程连接 mysql 的详细教程一、前缀条件确认二、打开 ID