zoukankan      html  css  js  c++  java
  • 数据建模和数据库设计

    http://blog.csdn.net/suwu150/article/details/52724937

    数据建模和数据库设计       
    一、    实体-关系图
            实体-关系图(Entity Relationship Diagram),也称为E-R图,提供了表示实体、属性和关系的方法,用来描述现实世界的概念模型。
            构成E-R图的基本要素是实体、属性和关系
            实体(Entity):实体用来表示具有相同特征和性质的事物(类似于java的类),实体由实体名和实体属性来表示。
            属性(Attribute):实体所具有的某一特性,一个实体可以有若干个属性
            关系(Relationship):实体彼此之间相互连接的方式称为关系。一般可分为以下 3 种类型:
                一对一关系 (1 ∶ 1)
                一对多关系 (1 ∶ N)
                多对多关系 (M ∶ N)    
        may-be 和 must-be
            在实体与实体之间的关系中,都会存在着may-be和must-be这俩种情况,例如:
            系统中有顾客和订单俩个实体(1:N关系),一个顾客对应多个订单,一个订单对应一个顾客,而且一个顾客可以(may be)没有订单和他对应,一个订单一定(must be)会有顾客和它对应.
    二、    ER图中符号的表示
            1) # : 唯一, 以后可能表示为主键
            2) * : 非空
            3) o : 可有可无
            4) 虚线: may be  顾客这边虚线,顾客可能没有订单
            5) 实线: must be 订单这边实线,订单一定是属于某个客户。
            6) 竖杠(|): 代表要强制在(|)一方建立一个联合主键,将对方ID拿过来做联合主键
            7) 伞状图标代表多的一方,不是伞状图标则代表一的一方
    三、    数据库设计
            数据建模完成之后,可以把ER图转换成数据中的表
                1.实体的名字转换为表的名字
                2.实体的属性转换为表中的列
                3.具有唯一特点的属性设置为表中的主键
                4.根据实体之间的关系设置为表中某列为外键列(主外键关联)
                注意:第四步主要是:实体关系--->表关系
            设计关系数据库时,遵从不同的规范要求,才能设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小
            目前关系数据库有六种范式:
            第一范式(1NF)
            第二范式(2NF)
            第三范式(3NF)
            巴斯-科德范式(BCNF)
            第四范式(4NF)
            第五范式(5NF,又称完美范式)
            注:满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需满足第三范式(3NF)就行了           
        第一范式:
            一个表中,每个列里面的值是不能再分割的.
            例如:我们设计的表中有一个列是:爱好
            这个列的值可能会是这样:足球篮球乒乓球
            但是这值是可以再分割的:足球、篮球、乒乓球
            所以这种设计是不满足第一范式
        第二范式:
            第二范式是在满足第一范式的基础上
            表中的非主键列都必须依赖于主键列
            例如:
            订单表: 订单编号 是主键
            订单编号  订单名称   订单日期  订单中产品的生产地
            这几个非主键列中,产品生产地是不依赖于订单编号的,所以这种设计是不满足第二范式
        第三范式:
            第三范式是在满足第二范式的基础上
            表中的非主键列都必须直接依赖于主键列,而不能间接的依赖.
            (不能产生依赖传递)
            例如:
            订单表:   订单编号 是主键
            订单编号  订单名称  顾客编号  顾客姓名

            顾客编号依赖于订单编号,顾客姓名依赖于顾客编号,从而顾客姓名间接的依赖于订单编号,那么这里产生了依赖传递,所以这个设计是不满足第三范式的   

    四、了解主键和外键
            主键:
            1.能做主键的列必须要满足非空唯一的特点
            2.只要满足非空唯一的任何列都可以做主键
            3.可以让表中一个有意义的列做主键,比如说学号,它既表示学生学号又作为表中的主键,因为这个列满足非空唯一的条件
            4.也可以找一个没有意义的列做主键,就是用来唯一标识一行记录的

            5.我们可以让多个列联合在一起做表中的主键,那么它就是联合主键,要求这几个列的值联合在一起是非空唯一的   

    如下图所示,创建联合主键数据库自动将其列设置为not null:

    [sql] view plain copy
    1. create table t_csdn(id number,name varchar2(20),primary key(id,name))  

            外键:
            1.表中的某一个列声明为外键列,一般这个外键列的值都会引用于另外一张表的主键列的值(有唯一约束的列就可以,不一定非要引用主键列)
            2.另外一张表的主键列中出现过的值都可以在外键列中使用,没有出现过的值,都不能使用
            3.外键列值也可以为空的,前提是这个外键列在表中不做主键,因为我们也可以把表中的外键列当做主键来使用(只有满足非空唯一的要求就可以)
            4.如果把B表中的联合主键的值引用到A表中做外键,因为是两个列在B表中做联合主键,那么A表引用过来的时候也要把俩个列的值都引用过来,那么它们在A表中就会作为一个联合外键出现

    如下图所示,引用上面所示的联合主键约束:

    [sql] view plain copy
    1. create table t_csdn2(  
    2.                     id number,name varchar2(20),  
    3.                     csdn_id number,  
    4.                     csdn_name varchar2(15),  
    5.                     primary key(id,name),  
    6.                     foreign key(csdn_id,csdn_name) references t_csdn(id,name));  

  • 相关阅读:
    BT656与BT1120的区别
    Arria10中PHY的时钟线结构
    Arria10中的IOPLL与fPLL
    Nios内部RAM固化配置
    实现1sym转换成2个sym送给CVI(VGA数据)
    embeded_2_separate_sync
    动态规划--青蛙跳
    动态规划 0--1 背包问题
    模拟题
    动态规划--最大子段和
  • 原文地址:https://www.cnblogs.com/feng9exe/p/7380634.html
Copyright © 2011-2022 走看看