精华内容
下载资源
问答
  • 数据库设计典型案例

    2018-12-23 12:05:53
    描述需求分析中,数据库应该如何设计;本文档通过数据库的大致流程来引导初学者走入需求分析的大门,培养软件开发者所必备的数据库设计技能。
  • 数据库作业案例

    千次阅读 2019-10-09 02:15:21
    数据库作业案例 复习 """ 1、单表查询 增删改查的完整语法 select distinct 字段 from 表 where group by having order by limit 比较:> < = 区间:between and | in | not in 逻辑: and or not 相似:...

    数据库作业案例

    复习

    """
    1、单表查询
        增删改查的完整语法
    select distinct 字段 from 表 where   group by   having   order by   limit  
    
    比较:> < =
    区间:between and  |  in  |  not in
    逻辑: and  or  not
    相似:like  _%
    正则:regexp
    
    聚合函数:group_concat()、max()
    
    having:可以对 聚合函数 结果进行筛选,不能使用 聚合函数 别名
    order by:分组后对 聚合函数 进行排序,能使用 聚合函数 别名
    limit:条数 | 偏移,条数
    
    
    2、多表查询
    内连接:from emp inner join dep on emp.dep_id = dep.id  只保存两表有对应关系的记录
    左连接:from emp left join dep on emp.dep_id = dep.id   左表记录全部保存,右边没有对应记录空填充
    右连接:from emp right join dep on emp.dep_id = dep.id  右表记录全部保存,左边没有对应记录空填充
    全连接:
    from emp left join dep on emp.dep_id = dep.id
    union
    from emp right join dep on emp.dep_id = dep.id
    """

    案例

    # 按指定编码创建数据库
    create database 数据库名 charset="编码格式";
    # 修改数据库编码
    alter database 数据库名 charset="编码格式";
    
    # 修改字段
    alter table 库.表 modify 字段 类型(长度) 约束;
    alter table 库.表 change 旧字段 新字段 类型(长度) 约束;
    
    # 创建一个学生student表,有主键id字段,name唯一字段、age字段、height字段、mobile字段
    create table student(
        id int not null auto_increment,
        name varchar(64) unique not null,
        age int unsigned default 0,
        height decimal(5,2) unsigned not null,
        mobile char(11),
        primary key(id),
        unique(name, mobile)
    );
    truncate student;
    
    # 字段的增加
    alter table 表名 add 字段 类型(长度) 约束 
    alter table 表名 add 字段 类型(长度) 约束 first
    alter table 表名 add 字段 类型(长度) 约束 after 已有字段
    
    # 移动字段
    alter table 表名 modify 字段 类型(长度) 约束 first
    
    # 将 学生表、国家表、课程表、学生简介表 四个表放在一起考虑表关系,并完成数据的增删测试
    create table country(
        id int,
        name varchar(16)
    );
    create table student(
        id int,
        name varchar(16),
        country_id int,
        foreign key(country_id) references country(id)
        on update cascade
        on delete cascade
    );
    create table student_info(
        id int,
        info varchar(256),
        student_id int unique,
        foreign key(student_id) references student(id)
        on update cascade
        on delete cascade
    );
    
    create table course(
        id int,
        name varchar(16)
    );
    create table student_course(
        id int,
        student_id int,
        course_id int,
        foreign key(student_id) references student(id)
        on update cascade
        on delete cascade,
        foreign key(course_id) references course(id)
        on update cascade
        on delete cascade
    )
    CREATE TABLE `emp`  (
      `id` int(0) NOT NULL AUTO_INCREMENT,
      `name` varchar(10) NOT NULL,
      `gender` enum('男','女','未知') NULL DEFAULT '未知',
      `age` int(0) NULL DEFAULT 0,
      `salary` decimal(5,2) NULL DEFAULT 0,
      `area` varchar(20) NULL DEFAULT '中国',
      `port` varchar(20) DEFAULT '未知',
      `dep` varchar(20),
      PRIMARY KEY (`id`)
    );
    
    INSERT INTO `emp` VALUES 
        (1, 'yangsir', '男', 42, 10.50, '上海', '浦东', '教职部'),
        (2, 'engo', '男', 38, 9.4, '山东', '济南', '教学部'),
        (3, 'jerry', '女', 30, 3.0, '江苏', '张家港', '教学部'),
        (4, 'tank', '女', 28, 2.4, '广州', '广东', '教学部'),
        (5, 'jiboy', '男', 28, 2.4, '江苏', '苏州', '教学部'),
        (6, 'zero', '男', 18, 8.8, '中国', '黄浦', '咨询部'),
        (7, 'owen', '男', 18, 8.8, '安徽', '宣城', '教学部'),
        (8, 'jason', '男', 28, 9.8, '安徽', '巢湖', '教学部'),
        (9, 'ying', '女', 36, 1.2, '安徽', '芜湖', '咨询部'),
        (10, 'kevin', '男', 36, 5.8, '山东', '济南', '教学部'),
        (11, 'monkey', '女', 28, 1.2, '山东', '青岛', '教职部'),
        (12, 'san', '男', 30, 9.0, '上海', '浦东', '咨询部'),
        (13, 'san1', '男', 30, 6.0, '上海', '浦东', '咨询部'),
        (14, 'san2', '男', 30, 6.0, '上海', '浦西', '教学部');
    # 查询教学部山东人的平均薪资
    # 1、查谁 2、从哪查 3、条件是啥
    select avg(salary) from emp where dep='教学部' and area='山东';
    select avg(salary) from emp where dep='教学部' group by area having area='山东';
    select avg(salary) from emp where area='山东' group by dep having dep='教学部';
    
    # 查询姓名中包含英文字母n并且居住在上海的人的所有信息
    select * from emp where name like '%n%' and area='上海';
    
    # 查询姓名中包含英文字母n但不包含数字的人的所有信息
    select * from emp where name like '%n%' and name not regexp '.*[0-9].*';
    
    # 查看各部门的平均年龄并降序排序
    select dep, avg(age) from emp group by dep order by avg(age) desc;
    
    # 查询各部门中年纪最大的人的姓名与居住地(户籍+区域)
    select max(age), dep from emp group by dep;
    
    select name, concat_ws('-', area, port) from emp 
    where (age, dep) in (('36', '咨询部'),('38', '教学部'),('42', '教职部'));
    
    select name, concat_ws('-', area, port) from emp 
    where (age, dep) in (select max(age), dep from emp group by dep);
    
    # 查询不同年龄层次平均薪资大于5w组中工资最高者的姓名与薪资
    select age, max(salary) from emp group by age having avg(salary) > 5;
    
    select name, salary from emp where (age, salary) in (select age, max(salary) from emp group by age having avg(salary) > 5);
    
    create table dep(
        id int primary key auto_increment,
        name varchar(16),
        work varchar(16)
    );
    create table emp(
        id int primary key auto_increment,
        name varchar(16),
        salary float,
        dep_id int
    );
    insert into dep values(1, '市场部', '销售'), (2, '教学部', '授课'), (3, '管理部', '开车');
    insert into emp(name, salary, dep_id) values('egon', 3.0, 2),('yanghuhu', 2.0, 2),('sanjiang', 10.0, 1),('owen', 88888.0, 2),('liujie', 8.0, 1),('yingjie', 1.2, 0);
    
    
    # 查询每一个部门下的员工们及员工职责
    # 1、查谁 2、从哪查,信息量不够连表 3、条件是啥,如果存在分组(不能直接查询的字段聚合处理 | 将要查询的字段添加进分组)
    select group_concat(emp.name), work, dep.name from emp right join dep on emp.dep_id=dep.id group by emp.dep_id, work, dep.name;
    
    select group_concat(emp.name) 员工们, max(work) 工作职责, max(dep.name) 部门 from emp right join dep on emp.dep_id=dep.id group by emp.dep_id;
    
    select group_concat(emp.name) 员工们, max(work) 工作职责, dep.name 部门 from emp right join dep on emp.dep_id=dep.id group by dep.name;

    转载于:https://www.cnblogs.com/zhangmingyong/p/11593788.html

    展开全文
  • 数据库经典案例分析,有图书管理系统,人事管理系统,学生管理系统
  • 数据库总结作业数据库设计

    千次阅读 2018-11-10 09:39:22
    数据库设计六个阶段: 一.需求分析阶段 二.概念结构设计阶段 三.逻辑结构设计阶段 四.物理结构设计阶段 五.数据库实施 六.数据库运行和维护 一.需求分析:  需求分析和概念设计独立于任何数据库管理系统 ...

    数据库设计六个阶段:

    一.需求分析阶段
    
    二.概念结构设计阶段
    
    三.逻辑结构设计阶段
    
    四.物理结构设计阶段
    
    五.数据库实施
    
    六.数据库运行和维护

    一.需求分析: 

    需求分析和概念设计独立于任何数据库管理系统 
    
    主要目的是综合各个用户应用需求
    
    重要:
    
    建立数据字典,数据字典内容为:
    
    1.数据项
    
    2.数据结构
    
    3.数据流,建立数据流程图
    
    4.数据存储
    
    5.处理过程

    二.概念结构设计阶段:

    形成独立于机器特点,独立于各个数据库管理系统产品的概念模式E-R图)

    重点是E-R图

    一.特点:

    1.能真实反映情况

    2.易于理解

    3.易于更改

    4.易于向各种关系模型转化

    二.两个实体联系

    1.   1:1

    2.   1:n

    3.   m:n

    三.三个实体联系

     上面的两个关系分别为讲授、供应关系

    四:单个实体型

    同一个实体集内的各实体之间也可以存在一对一、一对多、多对多的联系。

    例如,职工实体型内部具有领导与被领导的联系,即某一职工(干部)“领导”若干名职工,而一个职工仅被另外一个职工直接领导,因此这是一对多的联系

    五.E-R图画法

    1.

    实体型用矩形表示

    实体属性用椭圆形表示

    联系用菱形表示,联系可以有属性

    例如:商品-供应图

    先画出出实体及实体间的关系,再加上属性

    例题1:

    转化过的关系模式是:

    部门(部门号,领导职工号...)主码是部门号,外码是领导职工号
    职工(职工号,部门号...)主码是职工号,外码是部门号
    产品(产品号,负责人职工号...)主码是产品号,外码是负责人职工号
    工作关系(职工号,产品号,工作天数)主码是(职工号,产品号)外码是职工号、产品号
    供应关系(供应商编号,产品编号,零件号)主码是(供应商编号,产品编号,零件号),外码是供应商编号、产品编号、零件号
    供应商(供应商编号...)主码就是它
    零件(零件号...)主码就是它
    1:1或1:n向对应的1端、n端合并时,关系的码不变,不增加

     例题2

     

    学生(...)主码是学号
    选课(学号,课程号,成绩)主码是(学号,课程号)外码是学号,课程号
    课程(课程号,课程名)主码是课程号
    教师(职工号,课程号,教师姓名,职称)主码是(职工号)外码是课程号

    例三

    公司(公司编号,公司名,地址)主码是公司编号
    仓库(仓库编号,仓库名,地址,所属公司编号)主码是(仓库编号),外码是所属公司编号
    职工(职工编号,姓名,性别,所在仓库号,聘期,工资)主码是(职工编号)外码是所在仓库编号
    //聘期和薪资是联系属性,在与N端合并时要加上,不要忘了

     例四:

     

    
    研究所(编号,名称,地址)主码是编号
    科研人员(职工号,性别,年龄,职称,所在研究所编号)主码是职工号,外码是所在研究所编号
    科研项目(项目号,项目名,经费,所在研究所编号)主码是项目号,外码是所在研究所编号
    研究工作关系(科研项目号,职工号,工作量)主码是(科研项目号,职工号)外码是科研项目号、职工号
    
    
    //
    
    
    

     

     

     可能有的冲突:

    属性、命名、结构冲突

    数据库设计的概念设计阶段,表示概念结构的常用方法和描述工具是(C )。
    A.层次分析法和层次结构图
    B.数据流程分析法和数据流程图
    C.实体联系法和实体联系图
    D.结构分析法和模块结构图

    三.逻辑结构设计阶段

    1. 首先将E-R图转换成具体的数据库产品支持的数据模型,如关系模型,

    形成数据库(重点是转化成关系模型)

    2. 然后根据用户处理的要求、安全性的考虑,在基本表的基础上再建立

    必要的视图(View),形成数据的外模式

     

    1.1

    一个1:1联系可以转换为一个独立的关系模式,也可以与任意一端对应的关系模式合并。

    1.转换为一个独立的关系模式

    关系的属性:与该联系相连的各实体的码以及联系本身的属性

    关系的候选码:每个实体的码均是该关系的候选码

    2.与某一端实体对应的关系模式合并

    合并后关系的属性:加入对应关系的码和联系本身的属性

    合并后关系的码:不变

    1.2一个1:n联系可以转换为一个独立的关系模式,也可以与n端对应的关系模式合并

    1.转换为一个独立的关系模式

    关系的属性:与该联系相连的各实体的码以及联系本身的属性

    关系的码:n端实体的码

    2.n端对应的关系模式合并

    合并后关系的属性:在n端关系中加入1端关系的码和联系本身的属性

    合并后关系的码:不变

    可以减少系统中的关系个数,一般情况下更倾向于采用这种方法

    3.一个m:n联系转换为一个关系模式

    关系的属性:与该联系相连的各实体的码以及联系本身的属性

    关系的码:各实体码的组合

    4.三个或三个以上实体间的一个多元联系转换为一个关系模式。

    关系的属性:与该多元联系相连的各实体的码以及联系本身的属性

    关系的码:各实体码的组合

    5.具有相同码的关系模式可合并

    目的:减少系统中的关系个数

    合并方法:

     将其中一个关系模式的全部属性加入到另一个关系模式中

     然后去掉其中的同义属性(可能同名也可能不同名)

     适当调整属性的次序

    例题:

    部门(属性加入了职工的码):部门号,部门名,经理职工编号(主码不变为部门号)

    职工(并上部门关系的码):职工号,部门编号,职务(主码不变为职工号)

    产品(并上职工的码):产品号,产品名,负责人编号(主码不变为产品号)

    供应商:供应商号,姓名

    零件:零件号,零件名

    职工工作(并上职工、产品码、联系属性):职工号,产品号,工作天数

    供应关系(并上产品、供应商、零件码及联系属性):产品号,零件号,供应商号,供应量

    在关系数据库设计中,设计关系模式是数据库设计中(A )阶段的任务
    A. 逻辑设计阶段 B. 概念设计阶段
    C. 物理设计阶段 D. 需求分析阶段

    分解范式也是

    四.物理结构设计阶段:

    根据数据库管理系统特点和处理的需要,进行物理存储安排,建立索引,形成数据库内模式

    数据库设计可划分为七个阶段,每个阶段都有自己的设计内容,“为哪些关系,在哪些属性上、键什么样的索引”这一设计内容应该属于(C )设计阶段。
    A. 概念设计 B. 逻辑设计
    C. 物理设计 D. 全局设计
    假设设计数据库性能用“开销”,即时间、空间及可能的费用来衡量,则在数据库应用系统生存期中存在很多开销。其中,对物理设计者来说,主要考虑的是(C )。
    A. 规划开销 B. 设计开销
    C. 操作开销 D. 维护开销

    五.数据库实施

    六.数据库运行和维护

     

     

     

     

     

    展开全文
  • 选课系统数据库设计案例sql
  • 数据库设计案例分析

    万次阅读 2016-06-30 09:39:02
     不少程序员在进行数据库设计的时候都遇到过树型关系的数据,例如常见的类别表,即一个大类,下面有若干个子类,某些子类又有子类这样的情况。当类别不确定,用户希望可以在任意类别下添加新的子类,或者删除某个...

    一、树型关系的数据表
      不少程序员在进行数据库设计的时候都遇到过树型关系的数据,例如常见的类别表,即一个大类,下面有若干个子类,某些子类又有子类这样的情况。当类别不确定,用户希望可以在任意类别下添加新的子类,或者删除某个类别和其下的所有子类,而且预计以后其数量会逐步增长,此时我们就会考虑用一个数据表来保存这些数据。按照教科书上的教导,第二类程序员大概会设计出类似这样的数据表结构:

    类别表_1(Type_table_1)
    名称     类型    约束条件   说明
    type_id   
       int        无重复     类别标识,主键
    type_name
       char(50)    不允许为空   类型名称,不允许重复
    type_father   int         
    不允许为空   该类别的父类别标识,如果是顶节点的话设定为某个唯一值

      这样的设计短小精悍,完全满足3NF,而且可以满足用户的所有要求。是不是这样就行呢?答案是NOWhy

      我们来估计一下用户希望如何罗列出这个表的数据的。对用户而言,他当然期望按他所设定的层次关系一次罗列出所有的类别,例如这样:
    总类别
      类别1
        类别1.1
          类别1.1.1
        类别1.2
      类别2
        类别2.1
      类别3
        类别3.1
        类别3.2
      ……

      看看为了实现这样的列表显示(树的先序遍历),要对上面的表进行多少次检索?注意,尽管类别1.1.1可能是在类别3.2之后添加的记录,答案仍然是N次。这样的效率对于少量的数据没什么影响,但是日后类型扩充到数十条甚至上百条记录后,单单列一次类型就要检索数十次该表,整个程序的运行效率就不敢恭维了。或许第二类程序员会说,那我再建一个临时数组或临时表,专门保存类型表的先序遍历结果,这样只在第一次运行时检索数十次,再次罗列所有的类型关系时就直接读那个临时数组或临时表就行了。其实,用不着再去分配一块新的内存来保存这些数据,只要对数据表进行一定的扩充,再对添加类型的数量进行一下约束就行了,要完成上面的列表只需一次检索就行了。下面是扩充后的数据表结构:

    类别表_2(Type_table_2)
    名称     类型    约束条件                       说明
    type_id   
       int        无重复                     类别标识,主键
    type_name
       char(50)    不允许为空                   类型名称,不允许重复
    type_father   int         
    不允许为空                   该类别的父类别标识,如果是顶节点的话设定为某个唯一值
    type_layer    char(6)     
    限定3,初始值为000000       类别的先序遍历,主要为减少检索数据库的次数

      按照这样的表结构,我们来看看上面例子记录在表中的数据是怎样的:

    type_id      type_name          type_father          type_layer
                
    总类别               0                 000000
                
    类别               1                 010000
                
    类别1.1              2                 010100
                
    类别1.2              2                 010200
                
    类别               1                 020000
                
    类别2.1              5                 020100
                
    类别               1                 030000
                
    类别3.1              7                 030100
                
    类别3.2              7                 030200
    10            
    类别1.1.1            3                 010101
    ……

      现在按type_layer的大小来检索一下:SELECT * FROM Type_table_2 ORDER BY type_layer

    列出记录集如下:

    type_id      type_name          type_father          type_layer
                
    总类别               0                 000000
                
    类别               1                 010000
                
    类别1.1              2                 010100
    10            
    类别1.1.1            3                 010101
                
    类别1.2              2                 010200
                
    类别               1                 020000
                
    类别2.1              5                 020100
                
    类别               1                 030000
                
    类别3.1              7                 030100
                
    类别3.2              7                 030200
    ……

      现在列出的记录顺序正好是先序遍历的结果。在控制显示类别的层次时,只要对type_layer字段中的数值进行判断,每2位一组,如大于0则向右移2个空格。当然,我这个例子中设定的限制条件是最多3层,每层最多可设99个子类别,只要按用户的需求情况修改一下type_layer的长度和位数,即可更改限制层数和子类别数。其实,上面的设计不单单只在类别表中用到,网上某些可按树型列表显示的论坛程序大多采用类似的设计。

      或许有人认为,Type_table_2中的type_father字段是冗余数据,可以除去。如果这样,在插入、删除某个类别的时候,就得对type_layer 的内容进行比较繁琐的判定,所以我并没有消去type_father字段,这也正符合数据库设计中适当保留冗余数据的来降低程序复杂度的原则,后面我会举一个故意增加数据冗余的案例。

      二、商品信息表的设计
      假设你是一家百货公司电脑部的开发人员,某天老板要求你为公司开发一套网上电子商务平台,该百货公司有数千种商品出售,不过目前仅打算先在网上销售数十种方便运输的商品,当然,以后可能会陆续在该电子商务平台上增加新的商品出售。现在开始进行该平台数据库的商品信息表的设计。每种出售的商品都会有相同的属性,如商品编号,商品名称,商品所属类别,相关信息,供货厂商,内含件数,库存,进货价,销售价,优惠价。你很快就设计出4个表:商品类型表(Wares_type),供货厂商表(Wares_provider),商品信息表(Wares_info)

    商品类型表(Wares_type)
    名称     类型    约束条件                       说明
    type_id   
       int        无重复                     类别标识,主键
    type_name
       char(50)    不允许为空                   类型名称,不允许重复
    type_father   int         
    不允许为空                   该类别的父类别标识,如果是顶节点的话设定为某个唯一值
    type_layer    char(6)     
    限定3,初始值为000000       类别的先序遍历,主要为减少检索数据库的次数

    供货厂商表(Wares_provider)
    名称     类型    约束条件                       说明
    provider_id   int    
        无重复                     供货商标识,主键
    provider_name char(100)   
    不允许为空                   供货商名称

    商品信息表(Wares_info)
    名称      类型    约束条件                       说明
    wares_id       int    
       无重复                       商品标识,主键
    wares_name     char(100)  
    不允许为空                     商品名称
    wares_type
       int        不允许为空           商品类型标识,和Wares_type.type_id关联
    wares_info     char(200)  
    允许为空                       相关信息
    provider       int        
    不允许为空                     供货厂商标识,和Wares_provider.provider_id关联
    setnum         int        
    初始值为                     内含件数,默认为1
    stock          int        
    初始值为                     库存,默认为0
    buy_price      money      
    不允许为空                     进货价
    sell_price     money      
    不允许为空                     销售价
    discount       money      
    不允许为空                     优惠价

      你拿着这3个表给老板检查,老板希望能够再添加一个商品图片的字段,不过只有一部分商品有图片。OK,你在商品信息表(Wares_info)中增加了一个haspicBOOL型字段,然后再建了一个新表——商品图片表(Wares_pic)

    商品图片表(Wares_pic)
    名称      类型    约束条件                       说明
    pic_id        int    
        无重复                       商品图片标识,主键
    wares_id      int         
    不允许为空                     所属商品标识,和Wares_info.wares_id关联
    pic_address
      char(200)   不允许为空           图片存放路径

      程序开发完成后,完全满足老板目前的要求,于是正式启用。一段时间后,老板打算在这套平台上推出新的商品销售,其中,某类商品全部都需添加长度的属性。第一轮折腾来了……当然,你按照添加商品图片表的老方法,在商品信息表(Wares_info)中增加了一个haslengthBOOL型字段,又建了一个新表——商品长度表(Wares_length)

    商品长度表(Wares_length)
    名称      类型    约束条件                       说明
    length_id     int    
        无重复                       商品图片标识,主键
    wares_id      int         
    不允许为空                     所属商品标识,和Wares_info.wares_id关联
    length
           char(20)    不允许为空           商品长度说明

      刚刚改完没多久,老板又打算上一批新的商品,这次某类商品全部需要添加宽度的属性。你咬了咬牙,又照方抓药,添加了商品宽度表(Wares_width)。又过了一段时间,老板新上的商品中有一些需要添加高度的属性,你是不是开始觉得你所设计的数据库按照这种方式增长下去,很快就能变成一个迷宫呢?那么,有没有什么办法遏制这种不可预见性,但却类似重复的数据库膨胀呢?我在阅读《敏捷软件开发:原则、模式与实践》中发现作者举过类似的例子:7.3 “Copy”程序。其中,我非常赞同敏捷软件开发这个观点:在最初几乎不进行预先设计,但是一旦需求发生变化,此时作为一名追求卓越的程序员,应该从头审查整个架构设计,在此次修改中设计出能够满足日后类似修改的系统架构。下面是我在需要添加长度的属性时所提供的修改方案:

      去掉商品信息表(Wares_info)中的haspic字段,添加商品额外属性表(Wares_ex_property)和商品额外信息表(Wares_ex_info)2个表来完成添加新属性的功能。

    商品额外属性表(Wares_ex_property)
    名称      类型    约束条件                       说明
    ex_pid        int    
        无重复                       商品额外属性标识,主键
    p_name        char(20)    
    不允许为空                     额外属性名称

    商品额外信息表(Wares_ex_info)
    名称        类型    约束条件                       说明
    ex_iid          int    
        无重复                       商品额外信息标识,主键
    wares_id        int         
    不允许为空                     所属商品标识,和Wares_info.wares_id关联
    property_id
        int         不允许为空           商品额外属性标识,和Wares_ex_property.ex_pid关联
    property_value  char(200)   
    不允许为空                     商品额外属性值

      在商品额外属性表(Wares_ex_property)中添加2条记录:
    ex_pid            p_name
                   
    商品图片
                   
    商品长度

      再在整个电子商务平台的后台管理功能中追加一项商品额外属性管理的功能,以后添加新的商品时出现新的属性,只需利用该功能往商品额外属性表(Wares_ex_property)中添加一条记录即可。不要害怕变化,被第一颗子弹击中并不是坏事,坏的是被相同轨道飞来的第二颗、第三颗子弹击中。第一颗子弹来得越早,所受的伤越重,之后的抵抗力也越强8)(待续)

      三、多用户及其权限管理的设计
      开发数据库管理类的软件,不可能不考虑多用户和用户权限设置的问题。尽管目前市面上的大、中型的后台数据库系统软件都提供了多用户,以及细至某个数据库内某张表的权限设置的功能,我个人建议:一套成熟的数据库管理软件,还是应该自行设计用户管理这块功能,原因有二:
      1.那些大、中型后台数据库系统软件所提供的多用户及其权限设置都是针对数据库的共有属性,并不一定能完全满足某些特例的需求;
      2.不要过多的依赖后台数据库系统软件的某些特殊功能,多种大、中型后台数据库系统软件之间并不完全兼容。否则一旦日后需要转换数据库平台或后台数据库系统软件版本升级,之前的架构设计很可能无法重用。

      下面看看如何自行设计一套比较灵活的多用户管理模块,即该数据库管理软件的系统管理员可以自行添加新用户,修改已有用户的权限,删除已有用户。首先,分析用户需求,列出该数据库管理软件所有需要实现的功能;然后,根据一定的联系对这些功能进行分类,即把某类用户需使用的功能归为一类;最后开始建表:
      
    功能表(Function_table)
    名称     类型    约束条件   说明
    f_id          int    
        无重复     功能标识,主键
    f_name        char(20)    
    不允许为空   功能名称,不允许重复
    f_desc        char(50)    
    允许为空     功能描述

    用户组表(User_group)
    名称     类型    约束条件   说明
    group_id      int         
    无重复        用户组标识,主键
    group_name    char(20)    
    不允许为空    用户组名称
    group_power   char(100)   
    不允许为空    用户组权限表,内容为功能表f_id的集合

    用户表(User_table)
    名称     类型    约束条件   说明
    user_id       int         
    无重复        用户标识,主键
    user_name     char(20)    
    无重复        用户名
    user_pwd      char(20)    
    不允许为空    用户密码
    user_type     int         
    不允许为空    所属用户组标识,和User_group.group_id关联

      采用这种用户组的架构设计,当需要添加新用户时,只需指定新用户所属的用户组;当以后系统需要添加新功能或对旧有功能权限进行修改时,只用操作功能表和用户组表的记录,原有用户的功能即可相应随之变化。当然,这种架构设计把数据库管理软件的功能判定移到了前台,使得前台开发相对复杂一些。但是,当用户数较大(10人以上),或日后软件升级的概率较大时,这个代价是值得的。


      四、简洁的批量m:n设计
      碰到m:n的关系,一般都是建立3个表,m一个,n一个,m:n一个。但是,m:n有时会遇到批量处理的情况,例如到图书馆借书,一般都是允许用户同时借阅n本书,如果要求按批查询借阅记录,即列出某个用户某次借阅的所有书籍,该如何设计呢?让我们建好必须的3个表先:

    书籍表(Book_table)
    名称     类型    约束条件   说明
    book_id       int         
    无重复        书籍标识,主键
    book_no       char(20)    
    无重复        书籍编号
    book_name     char(100)   
    不允许为空    书籍名称
    ……

    借阅用户表(Renter_table)
    名称     类型    约束条件   说明
    renter_id     int         
    无重复        用户标识,主键
    renter_name   char(20)    
    不允许为空    用户姓名
    ……

    借阅记录表(Rent_log)
    名称     类型    约束条件   说明
    rent_id       int         
    无重复        借阅记录标识,主键
    r_id          int         
    不允许为空    用户标识,和Renter_table.renter_id关联
    b_id          int         
    不允许为空    书籍标识,和Book_table.book_id关联
    rent_date     datetime    
    不允许为空    借阅时间
    ……

      为了实现按批查询借阅记录,我们可以再建一个表来保存批量借阅的信息,例如:

    批量借阅表(Batch_rent)
    名称     类型    约束条件   说明
    batch_id      int         
    无重复        批量借阅标识,主键
    batch_no      int         
    不允许为空    批量借阅编号,同一批借阅的batch_no相同
    rent_id       int         
    不允许为空    借阅记录标识,和Rent_log.rent_id关联
    batch_date    datetime    
    不允许为空    批量借阅时间

      这样的设计好吗?我们来看看为了列出某个用户某次借阅的所有书籍,需要如何查询?首先检索批量借阅表(Batch_rent),把符合条件的的所有记录的rent_id字段的数据保存起来,再用这些数据作为查询条件带入到借阅记录表(Rent_log)中去查询。那么,有没有什么办法改进呢?下面给出一种简洁的批量设计方案,不需添加新表,只需修改一下借阅记录表(Rent_log)即可。修改后的记录表(Rent_log)如下:

    借阅记录表(Rent_log)
    名称     类型    约束条件   说明
    rent_id       int         
    无重复        借阅记录标识,主键
    r_id          int         
    不允许为空    用户标识,和Renter_table.renter_id关联
    b_id          int         
    不允许为空    书籍标识,和Book_table.book_id关联
    batch_no      int         
    不允许为空    批量借阅编号,同一批借阅的batch_no相同
    rent_date     datetime    
    不允许为空    借阅时间
    ……

      其中,同一次借阅的batch_no和该批第一条入库的rent_id相同。举例:假设当前最大rent_id64,接着某用户一次借阅了3本书,则批量插入的3条借阅记录的batch_no都是65。之后另外一个用户租了一套碟,再插入出租记录的rent_id68。采用这种设计,查询批量借阅的信息时,只需使用一条标准T_SQL的嵌套查询即可。当然,这种设计不符合3NF,但是和上面标准的3NF设计比起来,哪一种更好呢?答案就不用我说了吧。


      五、冗余数据的取舍
      上篇的树型关系的数据表中保留了一个冗余字段,这里的例子更进一步——添加了一个冗余表。先看看例子:我原先所在的公司为了解决员工的工作餐,和附近的一家小餐馆联系,每天吃饭记账,费用按人数平摊,月底由公司现金结算,每个人每个月的工作餐费从工资中扣除。当然,每天吃饭的人员和人数都不是固定的,而且,由于每顿工作餐的所点的菜色不同,每顿的花费也不相同。例如,星期一中餐5人花费40元,晚餐2人花费20,星期二中餐6人花费36元,晚餐3人花费18元。为了方便计算每个人每个月的工作餐费,我写了一个简陋的就餐记账管理程序,数据库里有3个表:

    员工表(Clerk_table)
    名称     类型    约束条件   说明
    clerk_id      int         
    无重复        员工标识,主键
    clerk_name    char(10)    
    不允许为空    员工姓名

    每餐总表(Eatdata1)
    名称     类型    约束条件   说明
    totle_id      int         
    无重复        每餐总表标识,主键
    persons       char(100)   
    不允许为空    就餐员工的员工标识集合
    eat_date      datetime    
    不允许为空    就餐日期
    eat_type      char(1)     
    不允许为空    就餐类型,用来区分中、晚餐
    totle_price   money       
    不允许为空    每餐总花费
    persons_num   int         
    不允许为空    就餐人数

    就餐计费细表(Eatdata2)
    名称     类型    约束条件   说明
    id            int         
    无重复        就餐计费细表标识,主键
    t_id          int         
    不允许为空    每餐总表标识,和Eatdata1.totle_id关联
    c_id          int         
    不允许为空    员工标识标识,和Clerk_table.clerk_id关联
    price         money       
    不允许为空    每人每餐花费

      其中,就餐计费细表(Eatdata2)的记录就是把每餐总表(Eatdata1)的一条记录按就餐员工平摊拆开,是个不折不扣的冗余表。当然,也可以把每餐总表(Eatdata1)的部分字段合并到就餐计费细表(Eatdata2)中,这样每餐总表(Eatdata1)就成了冗余表,不过这样所设计出来的就餐计费细表重复数据更多,相比来说还是上面的方案好些。但是,就是就餐计费细表(Eatdata2)这个冗余表,在做每月每人餐费统计的时候,大大简化了编程的复杂度,只用类似这么一条查询语句即可统计出每人每月的寄餐次数和餐费总帐:

    SELECT clerk_name AS personname,COUNT(c_id) as eattimes,SUM(price) AS ptprice FROM Eatdata2 JOIN Clerk_tabsle ON (c_id=clerk_id) JOIN eatdata1 ON (totleid=tid) WHERE eat_date>=CONVERT(datetime,'"&the_date&"') AND eat_date

      想象一下,如果不用这个冗余表,每次统计每人每月的餐费总帐时会多麻烦,程序效率也够呛。那么,到底什么时候可以增加一定的冗余数据呢?我认为有2个原则:

      1、用户的整体需求。当用户更多的关注于,对数据库的规范记录按一定的算法进行处理后,再列出的数据。如果该算法可以直接利用后台数据库系统的内嵌函数来完成,此时可以适当的增加冗余字段,甚至冗余表来保存这些经过算法处理后的数据。要知道,对于大批量数据的查询,修改或删除,后台数据库系统的效率远远高于我们自己编写的代码。
      2、简化开发的复杂度。现代软件开发,实现同样的功能,方法有很多。尽管不必要求程序员精通绝大部分的开发工具和平台,但是还是需要了解哪种方法搭配哪种开发工具的程序更简洁,效率更高一些。冗余数据的本质就是用空间换时间,尤其是目前硬件的发展远远高于软件,所以适当的冗余是可以接受的。不过我还是在最后再强调一下:不要过多的依赖平台和开发工具的特性来简化开发,这个度要是没把握好的话,后期维护升级会栽大跟头的。

    展开全文
  • 本资源为大连理工大学软件学院的数据库设计作业 背景为某一农产品网上商城系统的数据库设计 图表 说明 SQL语句详尽 各位学弟学妹们可以做以参考
  • 本文档是一个完整的用access开发的高校教师管理系统的数据库设计过程,包括需求分析、分析、设计到开发完成的整个过程,可以作为模板来学习使用。
  • Oracle数据库设计,用Oracle设计数据库,并通过实例进行实现,含有数据库操作的所有sql语句和注释。有java的源代码和大作业文档
  • 数据库课程设计作业报告

    千次阅读 2019-01-10 22:36:24
    题目大概是用可视化编程实现一个简单的数据库管理系统 我用的是BCB 题目虽然是简单 但也明白了很多以前以为懂的问题 代码到没什么 这种题目用BCB的话已经不用几行代码了 关键是了解了这些名词Paradox,ADO,BDE...

    题目大概是用可视化编程实现一个简单的数据库管理系统

    我用的是BCB

    题目虽然是简单 但也明白了很多以前以为懂的问题

    代码到没什么 这种题目用BCB的话已经不用几行代码了

    关键是了解了这些名词Paradox,ADO,BDE,ODBC

    一开始拖控件,写几行代码 很快就完成了

    编译也通过了 但传到同学机器上就是显示不出数据来

    折腾了我1天 又是发帖子 又是问群里的达人

    后来明白了我用的Paradox数据库是用BDE引擎的

    发布软件的时候要把BDE打包

    于是又学着打包BDE 却发现不到1m的软件如果打包BDE的话就10+m了

    而且BCB6自带的那个打包软件用的我头晕目眩

    于是又想不用BDE 所以又折腾了我半天

    答案是要使用ADO控件( 以前我用的是BDE控件 )

    而且要用Access数据库

    了解了这些之后 作业也就完成了

    总的看来还是很有收获的

    幸亏我下了决心这个作业要自己做

    没有去网上下载 呵呵~~

    作业在  http://lsaint.ys168.com

     

    展开全文
  • 1、什么是数据库代理作业呢?      sql代理作业主要是用来存储作业信息,作业包含一个或多个作业步骤,每个步骤都有自己的任务或者每个任务的执行时间。 比如:你想要在特定时间中定时执行某段代码,...
  • 数据库设计案例(1)

    万次阅读 2018-03-08 17:04:28
    现有菜单: 一 二 三 四如果要是实现: A用户登录后显示菜单为一、二 B用户登录后显示菜单为二、三 C用户登录后显示菜单为一、二、三 D用户登录后显示菜单为一、二、三、四(1)进行相关的模型设计:用户信息: 用户...
  • 大二下因为有一门专业必修课为数据库原理,于是在完成了该课程要求的大作业之后,重新审视一遍当初的设计思路,并进行一些总结。 开发环境 系统:Windows10(64位)家庭版 数据库:Mysql 开发语言及工具:Java,采用...
  • 一个进销存数据库设计案例

    万次阅读 2014-08-19 17:40:09
    [c-sharp] view plaincopy CREATE TABLE user(   User_Id varchar(6),   User_Pwd varchar(8) NULL,   Again_Pwd varchar(8) NULL,   Bel_Group varchar(3)... Div_Type varchar
  • MySchool数据库设计优化所有作业习题答案+课件
  • 7. 8. 10. 系(系号,系名,学校名) 班级(班号,班名,系号) 教研室(室号,室名系号) 学生(学号,姓名,学历,班号,系号,教员号) 教员(教员号,姓名,职称,室号) 选课(课程号,学号,成绩) 产品(产品号,产品名) ...
  • 数据库设计报告

    2013-06-05 14:31:03
    关于SQL Server数据库设计报考参考,有些关于实体或者分类的含义在写报告时可能分辨不清,该文档可以帮助你理清思路,提供案例
  • 数据库系统设计作业:图书馆管理系统

    千次阅读 多人点赞 2020-12-04 09:12:45
    针对图书馆的图书管理系统数据库设计,分别对图书馆的读者、一般工作人员和部门负责人进行详细地分析,总结出如下的需求信息: (1)图书馆中的图书具有书号、书名、作者、馆藏册数、在馆册数、价格、出版社及摘要等...
  • 大学生数据库作业服装销售复案例系统文档内附数据库代码,
  • 数据库设计经验

    2019-03-25 10:42:54
    一个好的数据结构设计或者说数据库设计,不仅能应对复杂的业务变化,更可以应对未来海量的数据扩容,同时数据结构逻辑清晰更方便业务人员去使用数据,而对开发人员来说,看到好的数据库设计,就像欣赏到了一个芳龄...
  • 1.开发环境:Mysql数据库;tomcat7.0;eclipse 基本设计要求: 1)用户管理:系统分为3级用户权限:超级管理员可以管理宿舍楼信息,楼中的宿舍房等信息;普通管理员可以管理宿舍成员;普通用户不用注册,可以直接...
  • 数据库的SQL预览代码我忘了复制了 只能截图 Students表: Course表: Score表: Teachcer表: 转载于:https://www.cnblogs.com/TENOKAWA/p/5538129.html...
  • 自选一个小型的数据库应用项目并深入到应用项目的现实世界中,进行系统分析和数据库设计。例如选择学籍管理系统、图书管理系统、材料管理系统或仓库管理系统等。 (1)画出实体间的E-R图 (2)利用企业管理器建立...
  • 本次课程设计的题目是证券业务管理系统系统,系统内容要求是:证券业务管理系统有n个客户,客户有账号,身份证号,姓名,地址,开户日期。属性。资金状态,交易信息。股票信息,委托信息。成交状况等。 管理人员:...
  • 数据库作业代码展示1

    千次阅读 2020-06-07 09:42:06
    --创建数据库 DROP DATABASE IF EXISTS curricula_variable_system; CREATE DATABASE curricula_variable_system; --建表 USE curricula_variable_system; DROP TABLE IF EXISTS SC DROP TABLE IF EXISTS ...
  • 安卓数据库案例

    2021-02-25 01:01:20
    自定义创建数据库类继承sqlliteopenhelper 初始化数据库 操作数据库 2、contentValues 主添加、修改:代表意义包装一行数据。 本质:Map集合;key=>代表的数据库表中字段,value=>字段设定值 3、whereclause ...
  • 数据库设计五戒

    2014-04-19 14:14:18
    众所周知,数据库设计的好坏直接关系到数据库运行的效率。根据笔者的经验,对于提升数据库性能来说,合理的数据库设计,比升级服务器的硬件配置,还要来的有效。但是,笔者无论是在跟同事合作,又或者是在论坛上跟...
  • 数据库设计之需求分析

    万次阅读 2018-07-01 11:02:21
    需求分析简单地说就是分析用户的需求,它是设计数据库的起点,需求分析结果是否准确反映用户的实际要求将直接直接影响到后面各阶段的设计,并影响到设计结果是否合理和实用。 1、需求分析的任务 需求分析的任务是...
  • 数据库设计(有实例)

    万次阅读 多人点赞 2017-12-03 15:27:59
    数据库设计就是根据业务系统的具体需求,结合我们所选用的DBMS(数据库管理系统),为这个业务系统构造出最优的数据存储模型。并建立数据库中的表结构以及表与表之间的关联关系的过程。使之能有效的对应用系统中的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,588
精华内容 4,635
关键字:

数据库设计作业案例