有没有用同一个表来介绍SQL的三大范式的例子

有没有用同一个表来介绍SQL的三大范式的例子,第1张

首先就得知道什么是sql的三大范式

1什么是数据库三范式?分别是哪三范式?各有什么优缺点?

所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。在第一范式(1NF)中表的每一行只包含一个实例的信息。简而言之,第一范式就是无重复的列。说明:在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。

第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。例如员工信息表中加上了员工编号(emp_id)列,因为每个员工的员工编号是惟一的,因此每个员工可以被惟一区分。这个惟一属性列被称为主关键字或主键、主码。

第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。简而言之,第二范式就是属性完全依赖于主键。

满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。例如,存在一个部门信息表,其中每个部门有部门编号(dept_id)、部门名称、部门简介等信息。那么在的员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。简而言之,第三范式就是属性不依赖于其它非主属性。

问题分析

因此不满足第二范式的要求,会产生如下问题

数据冗余: 同一门课程由n个学生选修,"学分"就重复n-1次;同一个学生选修了m门课程,姓名和年龄就重复了m-1次。

更新异常:

1)若调整了某门课程的学分,数据表中所有行的"学分"值都要更新,否则会出现同一门课程学分不同的情况。

2)假设要开设一门新的课程,暂时还没有人选修。这样,由于还没有"学号"关键字,课程名称和学分也无法记录入数据库。

删除异常 : 假设一批学生已经完成课程的选修,这些选修记录就应该从数据库表中删除。但是,与此同时,课程名称和学分信息也被删除了。很显然,这也会导致插入异常。212 解决方案

把选课关系表SelectCourse改为如下三个表:学生:Student(学号,姓名, 年龄,性别,系别,系办地址、系办电话);课程:Course(课程名称, 学分);选课关系:SelectCourse(学号, 课程名称, 成绩)。22 第三范式(3NF)实例分析

接着看上面的学生表Student(学号,姓名, 年龄,性别,系别,系办地址、系办电话),关键字为单一关键字"学号",因为存在如下决定关系:

(学号)→ (姓名, 年龄,性别,系别,系办地址、系办电话)

但是还存在下面的决定关系

(学号) → (所在学院)→(学院地点, 学院电话)

即存在非关键字段"学院地点"、"学院电话"对关键字段"学号"的传递函数依赖。

它也会存在数据冗余、更新异常、插入异常和删除异常的情况。 (数据的更新,删除异常这里就不分析了,可以参照211进行分析)

根据第三范式把学生关系表分为如下两个表就可以满足第三范式了:

学生:(学号, 姓名, 年龄, 性别,系别);

系别:(系别, 系办地址、系办电话)。

总结

上面的数据库表就是符合I,II,III范式的,消除了数据冗余、更新异常、插入异常和删除异常。

希望对你有帮助哈

*** 作顺序如下:

1创建实例启动用的参数文件。在程序默认的参数文件里修改即可:重命名规则 initSIDora

/u01/oracle/product/1120/db_1/dbs/ 下,目录尽量使用绝对路径,采用ORACLE_BASE等环境变量有可能报错。

例 initcrmora

db_name='crm' --修改

#memory_target=500m --注释掉

sga_target=200m --添加

pga_aggregate_target=60m --添加

processes = 150

audit_file_dest='/u01/oracle/admin/crm/adump' --建立目录

audit_trail ='db'

db_block_size=8192

db_domain=''

db_recovery_file_dest='/u01/oracle/flash_recovery_area' --建立目录

db_recovery_file_dest_size=2G

diagnostic_dest='/u01/oracle' ---修改

dispatchers='(PROTOCOL=TCP) (SERVICE=ORCLXDB)'

open_cursors=300

remote_login_passwordfile='EXCLUSIVE'

undo_tablespace='UNDOTBS1'

2创建相应目录:

mkdir -p /u01/oracle/admin/ora11g/adump

mkdir -p /u01/oracle/admin/ora11g/dpdump

mkdir -p /u01/oracle/flash_recovery_area

3创建密码文件:命名规则 orapwSID,目录依旧是 /u01/oracle/product/1120/db_1/dbs/

Linux下orapw+实例名

Windows下pwd+实例名

$ orapwd file=orapwora11g password=oracle

4创建数据库实例

设置环境变量 export ORACLE_SID=crm

执行以下命令

sqlplus /nolog

conn / as sysdba

注意:本处可能报错需要可能的原因: a)glibc-devel-25-58el5_64、libaio-03106-5包是否已安装,命令分别为rpm -q glibc-devel、rpm -q libaio

b)oracle目录权限不足或属组不对,chmod 6751 oracle 授权、chown -R oracleoinstall /u01/oracle 修改属组

执行建库脚本:

startup nomount pfile="/u01/oracle/product/11201/db1/dbs/initcrmora";

CREATE DATABASE "crm"

MAXINSTANCES 8

MAXLOGHISTORY 1

MAXLOGFILES 16

MAXLOGMEMBERS 3

MAXDATAFILES 100

DATAFILE '/u01/oracle/oradata/system01dbf' SIZE 1024M REUSE

EXTENT MANAGEMENT LOCAL

SYSAUX DATAFILE '/u01/oracle/oradata/sysaux01dbf' SIZE 500M REUSE

SMALLFILE DEFAULT TEMPORARY TABLESPACE TEMP TEMPFILE '/u01/oracle/oradata/temp01dbf' SIZE 20M REUSE

SMALLFILE UNDO TABLESPACE "UNDOTBS1" DATAFILE '/u01/oracle/oradata/undo01dbf' SIZE 300M REUSE

CHARACTER SET ZHS16GBK

NATIONAL CHARACTER SET AL16UTF16

LOGFILE GROUP 1 ('/u01/oracle/oradata/log01dbf') SIZE 50M,

GROUP 2 ('/u01/oracle/oradata/log02dbf') SIZE 50M,

GROUP 3 ('/u01/oracle/oradata/log03dbf') SIZE 50M;

创建USERS表空间

CREATE SMALLFILE TABLESPACE "USERS" LOGGING DATAFILE '/u01/app/oradata/user01dbf' SIZE 1000M REUSE EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;

ALTER DATABASE DEFAULT TABLESPACE "USERS";

------------------------------------------

SQL> create spfile from pfile;

File created

-----------------------------------------

sqlplus / as sysdba

SQL> show user;

@/u01/oracle/product/11201/db1/rdbms/admin/catalogsql;

@/u01/oracle/product/11201/db1/rdbms/admin/catblocksql;

@/u01/oracle/product/11201/db1/rdbms/admin/catprocsql;

@/u01/oracle/product/11201/db1/rdbms/admin/catoctksql;

@/u01/oracle/product/11201/db1/rdbms/admin/owminstplb;

使用system用户编译

@/u01/oracle/product/11201/db1/sqlplus/admin/pupbldsql;

@/u01/oracle/product/11201/db1/sqlplus/admin/help/hlpbldsql helpussql;

使用sys用户编译

@/u01/oracle/product/11201/db1/javavm/install/initjvmsql;

@/u01/oracle/product/11201/db1/xdk/admin/initxmlsql;

@/u01/oracle/product/11201/db1/xdk/admin/xmljasql;

@/u01/oracle/product/11201/db1/rdbms/admin/catjavasql;

@/u01/oracle/product/11201/db1/rdbms/admin/catexfsql;

@/u01/oracle/product/11201/db1/rdbms/admin/catqmsql change_on_install SYSAUX TEMP YES;

@/u01/oracle/product/11201/db1/rdbms/admin/catxdbjsql;

@/u01/oracle/product/11201/db1/rdbms/admin/catrulsql;

spool /oracle/admin/edidb/scripts/ordinstlog append

@/u01/oracle/product/11201/db1/ord/admin/ordinstsql SYSAUX SYSAUX;

spool off

spool /u01/oracle/admin/ora11g/scripts/interMedialog append

@/u01/oracle/product/11201/db1/ord/im/admin/iminstsql;

spool off

set echo on

spool /oracle/admin/edidb/scripts/lockAccountlog append

BEGIN

FOR item IN ( SELECT USERNAME FROM DBA_USERS WHERE ACCOUNT_STATUS IN ('OPEN', 'LOCKED', 'EXPIRED') AND USERNAME NOT IN (

'SYS','SYSTEM') )

LOOP

dbms_outputput_line('Locking and Expiring: ' || itemUSERNAME);

execute immediate 'alter user ' ||

sysdbms_assertenquote_name(

sysdbms_assertschema_name(

itemUSERNAME),false) || ' password expire account lock' ;

END LOOP;

END;

/

spool off

到此,数据库实例建立完毕。

打开MySQL Workbench 80 CE软件,单击要启动的MySQL数据库连接

输入密码后,点击OK,进入数据库实例管理界面,可以看到很多数据库实例

接下来,可以新建一个数据库实例,也可以在已存在的数据库中创建数据库实体表,展开要增加表的数据库实例,右击 tables,再点击 create table

输入表名等信息,然后点击 apply

确认后,再次点击 apply,最后点击 finish,就成功创建数据库实体表了。

从Windows桌面执行“开始”→“程序”→“Oracle - <ORACLE_HOME_NAME>”→“配置和移置工具”→“Database Configuration Assistant”命令,打开Database Configuration Assistant对话框的欢迎界面,单击该界面中的“下一步”按钮

启用“创建数据库”选项,单击“下一步”按钮,进入“步骤2:数据库模板”界面

启用“一般用途或事务处理”选项,单击“下一步”按钮,进入“步骤3:数据库标识”界面

在“步骤3:数据库标识”界面中设置新数据库的全局数据库名,这里设置为myorcl,而数据库实例名(SID)默认与全局数据库名相同,也为myorcl

设置好口令后,单击“下一步”按钮,进入“步骤6:存储选项”界面,在该界面中启用“文件系统”选项

单击“下一步”按钮,进入“步骤7:数据库文件所在位置”界面。设置好存储位置后,单击“下一步”按钮,进入“步骤8

¤采用默认设置,单击“下一步”按钮,进入“步骤9:数据库内容”界面,该界面中可以对示例方案及定制脚本进行配置。采用默认设置,单击“下一步”按钮,进入“步骤10:初始化参数”界面,该界面中可以对内存、调整大小、字符集和连接模式进行配置。采用默认设置,单击“下一步”按钮,进入“步骤11:安全设置”界面,在该界面中采用默认设置,即启用“保留增强的11g默认安全设置”选项。¤单击“下一步”按钮,进入“步骤 12:自动维护任务”界面,在该界面中选择“启用自动维护任务”选项。

单击“下一步”按钮,进入“步骤13:数据库存储”界面,在该界面中可以指定数据库的存储参数,单击“下一步”按钮,进入“步骤14:创建选项”界面

单击“完成”按钮,在d出的“确认”对话框中单击“确定”按钮,即可开始新数据库的创建

解释: 数据库(database):物理 *** 作系统文件或磁盘( disk)的集合。使用Oracle 10g 的自动存储管理(Automatic Storage Management,ASM)或RAW 分区时,数据库可能不作为 *** 作系统中单独的文件,但定义仍然不变。 实例(instance):一组Oracle 后台进程/线程以及一个共享内存区,这些内存由同一个计算机上运行的线程/进程所共享。这里可以维护易失的、非持久性内容(有些可以刷新输出到磁盘)。就算没有磁盘存储,数据库实例也能存在。也许实例不能算是世界上最有用的事物,不过你完全可以把它想成是最有用的事物,这有助于对实例和数据库划清界线。 这两个词有时可互换使用,不过二者的概念完全不同。实例和数据库之间的关系是:数据库可以由多个实例装载和打开,而实例可以在任何时间点装载和打开一个数据库。实际上,准确地讲,实例在其整个生存期中最多能装载和打开一个数据库!补充: 一般来说,我们的一个数据库对应一个实例,但在集群RAC情况下,共享数据库文件时,一个数据库是可以被多个实例同时使用的。演示启动xxx实例,挂接数据库,打开数据库,关闭数据库、卸载数据库、关闭实例的过程。1、为了能进行以上 *** 作,oracle的监听必须首先启动,这样,我们才有机会连接到oracle服务器端。可以通过如下命令进行:lsnrctl start;2、oracle启动,windows下通常在服务里启动oracle,一般情况下同时启动相关实例,但也可以设置启动oracle时,不启动任何指定实例,这样oracle的启动速度相当快。3、设定我们需要启动的相关实例。在console窗口中,输入 set oracle_sid=xxx (unix环境下用export命令)4、用/nolog方式,进入sqlplus。 在console窗口中,输入 sqlplus /nolog ,然后回车,则进入sqlplus环境。5、输入命令 connect sys as sysdba 回车后,提示输入口令,直接回车,则以sysdba的角色连接到oracle的空闲实例。6、输入命令 startup nomount 回车,则启动了xxx实例,由set oracle_sid=xxx设置。7、输入命令 alter database mount 回车,则将相应的数据库挂接到xxx实例。8、输入命令 alter database open 回车,则打开了相应数据库。9、输入命令 shutdown,则关闭数据库、卸载数据库、关闭实例。oracle数据库的实例,其中“实例”是什么意思?

以上就是关于有没有用同一个表来介绍SQL的三大范式的例子全部的内容,包括:有没有用同一个表来介绍SQL的三大范式的例子、oracle11g怎么建立实例数据库、mysql8.0怎么建一个数据库等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9803815.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存