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中的交叉连接、自然连接和内连接查询详解

《MySQL中的交叉连接、自然连接和内连接查询详解》:本文主要介绍MySQL中的交叉连接、自然连接和内连接查询,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、引入二、交php叉连接(cross join)三、自然连接(naturalandroid join)四

Mysql如何将数据按照年月分组的统计

《Mysql如何将数据按照年月分组的统计》:本文主要介绍Mysql如何将数据按照年月分组的统计方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql将数据按照年月分组的统计要的效果方案总结Mysql将数据按照年月分组的统计要的效果方案① 使用 DA

Mysql表如何按照日期字段的年月分区

《Mysql表如何按照日期字段的年月分区》:本文主要介绍Mysql表如何按照日期字段的年月分区的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、创键表时直接设置分区二、已有表分区1、分区的前置条件2、分区操作三、验证四、注意总结一、创键表时直接设置分区

mysql的基础语句和外键查询及其语句详解(推荐)

《mysql的基础语句和外键查询及其语句详解(推荐)》:本文主要介绍mysql的基础语句和外键查询及其语句详解(推荐),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录一、mysql 基础语句1. 数据库操作 创建数据库2. 表操作 创建表3. CRUD 操作二、外键

MySQL更新某个字段拼接固定字符串的实现

《MySQL更新某个字段拼接固定字符串的实现》在MySQL中,我们经常需要对数据库中的某个字段进行更新操作,本文就来介绍一下MySQL更新某个字段拼接固定字符串的实现,感兴趣的可以了解一下... 目录1. 查看字段当前值2. 更新字段拼接固定字符串3. 验证更新结果mysql更新某个字段拼接固定字符串 -

python连接本地SQL server详细图文教程

《python连接本地SQLserver详细图文教程》在数据分析领域,经常需要从数据库中获取数据进行分析和处理,下面:本文主要介绍python连接本地SQLserver的相关资料,文中通过代码... 目录一.设置本地账号1.新建用户2.开启双重验证3,开启TCP/IP本地服务二js.python连接实例1.

Spring Boot项目中结合MyBatis实现MySQL的自动主从切换功能

《SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能》:本文主要介绍SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能,本文分步骤给大家介绍的... 目录原理解析1. mysql主从复制(Master-Slave Replication)2. 读写分离3.

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Ubuntu中远程连接Mysql数据库的详细图文教程

《Ubuntu中远程连接Mysql数据库的详细图文教程》Ubuntu是一个以桌面应用为主的Linux发行版操作系统,这篇文章主要为大家详细介绍了Ubuntu中远程连接Mysql数据库的详细图文教程,有... 目录1、版本2、检查有没有mysql2.1 查询是否安装了Mysql包2.2 查看Mysql版本2.

Oracle数据库常见字段类型大全以及超详细解析

《Oracle数据库常见字段类型大全以及超详细解析》在Oracle数据库中查询特定表的字段个数通常需要使用SQL语句来完成,:本文主要介绍Oracle数据库常见字段类型大全以及超详细解析,文中通过... 目录前言一、字符类型(Character)1、CHAR:定长字符数据类型2、VARCHAR2:变长字符数