数据库设计 订阅
数据库设计(Database Design)是指对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其应用系统,使之能够有效地存储数据,满足各种用户的应用需求(信息要求和处理要求)。在数据库领域内,常常把使用数据库的各类系统统称为数据库应用系统。数据库设计的设计内容包括:需求分析、概念结构设计、逻辑结构设计、物理结构设计、数据库的实施和数据库的运行和维护。 展开全文
数据库设计(Database Design)是指对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其应用系统,使之能够有效地存储数据,满足各种用户的应用需求(信息要求和处理要求)。在数据库领域内,常常把使用数据库的各类系统统称为数据库应用系统。数据库设计的设计内容包括:需求分析、概念结构设计、逻辑结构设计、物理结构设计、数据库的实施和数据库的运行和维护。
信息
范    围
使用数据库的各类系统
外文名
Database Design
设计内容
需求分析、概念结构设计、逻辑结构设计等
中文名
数据库设计
设计原则
一对一设计、独特命名、双向使用
目    的
数据库及其应用系统
数据库设计定义
数据库设计(Database Design)是指根据用户的需求,在某一具体的数据库管理系统上,设计数据库的结构和建立数据库的过程。数据库系统需要操作系统的支持。数据库设计是建立数据库及其应用系统的技术,是信息系统开发和建设中的核心技术。由于数据库应用系统的复杂性,为了支持相关程序运行,数据库设计就变得异常复杂,因此最佳设计不可能一蹴而就,而只能是一种“反复探寻,逐步求精”的过程,也就是规划和结构化数据库中的数据对象以及这些数据对象之间关系的过程。
收起全文
精华内容
下载资源
问答
  • 1引言 4 1.1编写目的 4 1.2背景 5 1.3定义 5 1.4参考资料 6 2数据库物理模型 7 2.1整体设计 7 2.2角色与权限管理 7 2.3消息管理 9 2.4用户信息 10 2.5分站信息表 12 2.6备份计划 13 2.7备份文件 14
  • 对于不太会设计数据库的朋友可以看看,从不同角度去实现数据库设计,此设计方法比较详细的设计了音乐平台数据库后台的需要!
  • 图书管理系统数据库设计

    万次阅读 多人点赞 2019-12-22 20:30:13
    实验八 图书管理系统数据库设计 一、实验学时 2学时 二、实验目的 (1)熟悉SQL Sever基本操作。 (2)利用T-SQL语句实现相关操作。 (3)通过完成从用户需求分析、概念结构设计,逻辑结构设计等一系列的数据库设计...

    实验八 图书管理系统数据库设计

    一、实验学时

    2学时

    二、实验目的

    (1)熟悉SQL Sever基本操作。
    (2)利用T-SQL语句实现相关操作。
    (3)通过完成从用户需求分析、概念结构设计,逻辑结构设计等一系列的数据库设计到上机编程、调试和应用等全过程,掌握数据库设计的基本步骤。
    (4)进一步理解和掌握数据库原理的相关内容。

    三、实验内容

    设计一个简单的图书管理系统包括图书馆内书籍的信息、学校在校学生的信息以及学生的借阅信息。此系统功能分为面向学生和面向管理员两部分,其中面向学生部分可以进行预定、续借和查询书籍等操作,面向管理员部分可以完成书籍和学生的增加、删除和修改以及对学生借阅、归还的确认。

    1.需求分析
    (1)学生
    学生的操作流程如图8-1所示。

    图8-1 学生的操作流程
    (2)管理员
    管理员可完成书籍和学生的增加、删除和修改以及对学生借阅、续借、归还的确认,其操作流程如图8-2 所示。

    图8-2 管理员操作流程

    2.概念模型设计
    数据库需要表述的信息有以下几种:
    (1)图书信息
    (2)学生信息
    (3)管理员信息
    (4)学生预定图书信息
    (5)学生借阅还图书信息
    说明:
    1)书号是图书的键码,每本书有唯一的书号。一个学生可同时借阅多本书。一个管理员可处理多个同学的借阅等事宜。
    2)一般情况下,学生、管理员和图书之间的联系为1:1:n,借书关系Lend作为连接关系,其键码为n端实体集的键码,即书号为借书关系的键码。这反映了如果还书时也把当初的借书记录删除,则书号就能唯一识别一个元组。
    如果还书时不同时删除借书记录,则意味着同一本书前后可借给不同的学生,于是学生、管理员和图书之间的联系变为m:1:n,这时借书关系的键码为书号和学号的组合。
    如果在不删除借书记录的情况下,同一学生再次借同一本书,这时,学生、管理员和图书之间的联系变为m:p:n,于是,借书关系的键码为书号、学号和管理员号的组合。但这里有一个隐含的信息,即同一学生前后两次借同一本书所遇到的管理员不同,而这种不同可能仅仅是“日期”不同。因此,借书日期成了必不可少的成分,也就是说,在这种情况下,属性全集才是借书关系的键码。
    总之,借书关系的键码与图书管理模式有关,读者可按照自己的理解确定键码,并编写相应的事务处理流程。其他关系也有类似之处。
    3)要知道图书当前的状态,是在图书馆存放,还是被借阅等,需要在Book的模式中增加对应项用以表示图书当前的状态。比如我们增加State,并且约定取值和状态的对应关系如下:
    0:在图书馆中并且没有被预定
    1:在图书馆中并且已被预定
    2:被借出并且没有被预定
    3:被借出并且已被预定
    用E-R模型表达该模型的设计,画出E-R模型如下:

    图8-3 模型的E-R图

    3.逻辑设计
    通过E-R模型到关系模型的设计,请写出关系模式:(实体或属性的英文可以自取)
    1、Book(BookID,Title,Author,Publisher,Pyear,Language,State)
    2、Student(ID,Name,Dept)
    3、Assist(ID,Name)
    4、BBook(BookID,StuID,BDate)
    5、RBook(BookID,StuID,RDate)
    6、Lend(StuID,AstID,BookID,LDate)
    7、BookRtn(StuID,AstID,BookID,RDate)

    4.物理设计
    为了提高在表中搜索元组的速度,在实际实现的时候应该基于键码建立索引。下面是各表中建立索引的表项:
    (1)在书表中按书号建立索引
    T-SQL语句:
    CREATE INDEX Book_Idx ON Book(BookID);
    (2)在学生表中按学号建立索引
    T-SQL语句:
    CREATE INDEX Student_Idx ON Student(ID);

    5.用T-SQL实现设计
    (1)建立数据库表(注意自定义约束)
    1)建Book(图书信息)表
    T-SQL:
    CREATE TABLE Book(
    BookID varchar(20) PRIMARY KEY,
    Title varchar(50) NOT NULL,
    Author varchar(50),
    Publisher varchar(50),
    Pyear char(8),
    Language char(2),
    State char(1) DEFAULT ‘0’);

    2)建Student(学生信息)表
    T-SQL:
    CREATE TABLE Student(
    ID varchar(10) PRIMARY KEY,
    Name varchar(18) NOT NULL,
    Dept varchar(18) NOT NULL);

    3)建Assist(管理员信息)表
    T-SQL:
    CREATE TABLE Assist(
    ID varchar(8) PRIMARY KEY,
    Name varchar(18) NOT NULL);

    4)建BBook(学生预定图书信息)表
    T-SQL:
    CREATE TABLE BBook(
    BookID varchar(20) NOT NULL,
    StuID varchar(10) NOT NULL,
    BDate datetime NOT NULL,
    CONSTRAINT PK_BBOOK
    PRIMARY KEY(BookID,StuID),
    CONSTRAINT FK_BBOOK_BID
    FOREIGN KEY(BookID) REFERENCES Book(BookID),
    CONSTRAINT FK_BBOOK_StdID
    FOREIGN KEY(StuID) REFERENCES Student(ID));

    5)建RBook(学生续借图书信息)表
    T-SQL:
    CREATE TABLE RBook(
    BookID varchar(20) NOT NULL,
    StuID varchar(10) NOT NULL,
    RDate datetime NOT NULL,
    CONSTRAINT PK_RBOOK
    PRIMARY KEY(BookID,StuID),
    CONSTRAINT FK_RBOOK_BookID
    FOREIGN KEY(BookID) REFERENCES Book(BookID),
    CONSTRAINT FK_RBOOK_StdID
    FOREIGN KEY(StuID) REFERENCES Student(ID));

    6)建Lend(学生借阅信息)表
    T-SQL:
    CREATE TABLE Lend(
    StuID varchar(10) NOT NULL,
    AstID varchar(8) NOT NULL,
    BookID varchar(20) NOT NULL,
    LDate datetime NOT NULL,
    CONSTRAINT PK_LEND
    PRIMARY KEY(StuID,AstID,BookID),
    CONSTRAINT FK_LEND_StuID
    FOREIGN KEY(StuID) REFERENCES Student(ID),
    CONSTRAINT FK_LEND_AstID
    FOREIGN KEY(AstID) REFERENCES Assist(ID),
    CONSTRAINT FK_LEND_BookID
    FOREIGN KEY(BookID) REFERENCES Book(BookID));

    7)建BookRtn(学生还书信息)表
    T-SQL:
    CREATE TABLE BookRtn(
    StuID varchar(10) NOT NULL,
    AstID varchar(8) NOT NULL,
    BookID varchar(20) NOT NULL,
    RDate datetime NOT NULL,
    CONSTRAINT PK_BookRtn
    PRIMARY KEY(StuID,AstID,BookID),
    CONSTRAINT FK_BookRtn_StdID
    FOREIGN KEY(StuID) REFERENCES Student(ID),
    CONSTRAINT FK_BookRtn_AstID
    FOREIGN KEY(AstID) REFERENCES Assist(ID),
    CONSTRAINT FK_BookRtn_BookID
    FOREIGN KEY(BookID) REFERENCES Book(BookID));

    (2)管理员操作
    1)在学生表中增加一位学生的基本信息:
    T-SQL:
    INSERT INTO Student(ID,Name,Dept) VALUES(#StuNo,#Name,#Dept);
    2)在学生信息表中删除一学生的信息。
    T-SQL:
    DELETE FROM Student WHERE(ID=#ID);
    3)在学生信息表中修改一学生信息。
    T-SQL:
    UPDATE Student SET Name=#Name, Dept=#Dept WHERE ID=#ID;
    4)在图书表中增加一本图书信息。
    T-SQL:
    INSERT INTO Book(BookID,Title,Author,Publisher,Pyear,Language)
    VALUES(#BookID,#Title,#Author,#Publisher,#Pyear,#Language);

    5)在图书表中删除一本图书信息。
    T-SQL:
    DELETE FROM Book WHERE BookID=#BookID;
    6)在图书信息表中修改一本图书信息。
    T-SQL:
    UPDATE Book SET Title=#Title, Author=#Author, Publisher=#Publisher,
    Pyear=#Pyear, Language=#Language WHERE BookID=#BookID;

    事务定义:
    1)定义学生借阅图书这一事务(即向学生借阅信息表中插入一条记录,同时修改图书信息表中相关书籍的状态信息)。
    T-SQL:
    BEGIN TRANSACTION
    INSERT INTO Lend(StuID,AstID,BookID,LDate)
    VALUES(#StuID,#AstID,#BookID,#LDate);
    UPDATE Book SET State=‘2’ WHERE BookID=#BookID
    COMMIT;

    2)定义学生归还图书这一事务(即向学生还书信息表中插入一条记录,同时修改图书信息表中相关书籍的状态信息)。
    T-SQL:
    BEGIN TRANSACTION
    INSERT INTO BookRtn(StuID,AstID,BookID,RDate)
    VALUES(#StuID, #AstID, #BookID, #RDate);
    UPDATE Book SET State=‘0’ WHERE BookID=#BookID;
    COMMIT;

    (3)学生操作
    存储过程定义:
    1)定义学生预定图书的存储过程
    提示:学生预定图书,假设图书已经被预定了,则不允许继续预定。否则的话应该根据图书是在馆内还是被借出去两种情况,修改图书当前的状态。最后在预定表中插入一条记录。修改记录和插入新记录都发生或都不发生,所以将这个动作封装成一个事务,保证这个操作的原子性。
    自定义如下:
    CREATE PROC Book_Book
    @BookID varchar(20),@StdID char(6), @BDate datetime
    AS
    DECLARE @TransName VARCHAR(20)
    SELECT @TransName=’Book_Book’
    BEGIN TRANSACTION @TransName
    DECLARE @booked int, @book_state_before char(1), @book_state_after char(1)
    SELECT @booked=count(*) FROM BBook WHERE BID=@BookID
    IF @booked>0
    ROLLBACK TRANSACTION @TransName
    ELSE BEGIN
    SELECT @book_state_before=state FROM Book WHERE BookID=@BookID
    IF @book_state_before=’0’
    SELECT @book_state_after=’1’
    ELSE IF @book_state_before=’2’
    SELECT @book_state_after=’3’
    UPDATE Book SET state=@book_state_after WHERE BookID=@BookID
    INSERT INTO BBook(BID,StdID,BDate) VALUES(@BookID,@StdID,@BDate)
    COMMIT TRANSACTION @TransName
    END
    GO

    2)定义学生续借图书的存储过程
    提示:学生续借图书,假定图书已经被预定了,则不允许续借。否则,在续借记录中插入一条记录就可以了。把这个动作封装成一个存储过程是为了使用方便明了。
    自定义如下:
    CREATE PROC Renew_Book
    @BookID varchar(20),@StdID char(6), @RDate datetime
    AS
    DECLARE @TransName VARCHAR(20)
    SELECT @TransName=’Renew_Book’
    BEGIN TRANSACTION @TransName
    DECLARE @booked int
    SELECT @booked=count(*) FROM BBook WHERE BID=@BookID
    IF @booked=0
    INSERT INTO RBook(BID,StdID,BDate) VALUES(@BookID,@StdID,@RDate)
    COMMIT TRANSACTION @TransName
    END
    GO

    展开全文
  • 顺丰快递数据库设计

    2014-12-01 12:54:05
    顺丰快递数据库设计
  • 数据库设计开发规范-阿里.pdf

    热门讨论 2017-06-23 16:26:55
    数据库设计开发规范-阿里.pdf
  • 学生选课系统数据库设计,包括可行性分析,系统分析,逻辑设计,数据库实现,数据库操作。涉及系统E-R图,部分E-R图等。
  • 数据库:数据库设计

    千次阅读 2020-11-16 16:47:49
    1,数据库设计概述 1.1,数据库设计的基本概念 数据库设计是指对于一个给定的应用环境,构造(设计)优化的数据库逻辑模式和物理结构,并据此建立数据库及其应用系统,使之能够有效地存储和管理数据,满足各种...

    1,数据库设计概述

    1.1,数据库设计的基本概念

    数据库设计是指对于一个给定的应用环境,构造(设计)优化的数据库逻辑模式和物理结构,并据此建立数据库及其应用系统,使之能够有效地存储和管理数据,满足各种用户的应用需求,包括信息管理要求和数据操作要求。

    数据库设计的目标:是为用户和各种应用系统提供一个信息基础设施和高效率的运行环境

    数据库设计的基本任务:是根据用户的信息需求、处理需求和数据库的支持环境(包括硬件、操作系统和DBMS),设计出数据库模式(包括外模式、逻辑模式和内模式)及其典型的应用程序

    1.2,数据库设计的方法

    直观设计法(手工试凑发):数据库设计只是一种经验的反复实施,而不能称为是一门科学,缺乏科学分析理论基础和工程手段的支持,因为设计质量与设计人员的经验和水平有直接关系,所以设计质量很难保证。具有周期短、效率高、操作简便、易于实现等优点。主要是用于简单小型系统。

    规范设计法:数据库设计分为若干阶段,明确规定各阶段的任务,采用“自顶向下、分层实现、逐步求精”的设计原则,结合数据库理论和软件工程设计方法,实现设计过程的每一细节,最终完成整个设计任务。(新奥尔良方法、基于E-R模型的数据库设计方法、基于3NF(第三范式)的设计方法、面向对象的数据库设计方法、统一建模语言(UML方法)。

    计算机辅助设计法:在数据库设计的某些过程中,利用计算机和一些辅助设计工具,模拟某一规范设计方法,并以人的知识或经验为主导,通过人机交互方式实现设计中的某些部分。 (Oracle 公司开发的 Designer、Sybase公司开发的 PowerDesigner)。

    1.3,数据库设计的基本步骤

    需求分析:通过详细调查现实世界要处理的对象(组织、部门、企业等),充分了解原系统(手工系统或计算机系统)工作概况,明确用户的各种需求。

    概念结构设计:通过对用户需求进行综合、归纳与抽象,形成一个独立于具体数据库管理系统的概念模型。

    逻辑结构设计:概念结构转换为某个数据库管理系统所支持的数据模型,并对其进行优化。

    物理结构设计:逻辑数据结构选取一个最适合应用环境的物理结构,包括存储结构和存取方法。

    数据库实施:根据逻辑设计和物理设计的结果构建数据库,编写与调试应用程序,组织数据入库并进行试运行。

    数据库运行和维护:经过试运行后即可投入正式运行,运行过程中必须不断对其进行评估、调整与修改。

    ★需求分析和概念设计独立于任何数据库管理系统

    ★逻辑设计和物理设计与选用的数据库管理系统密切相关

    设计阶段

    设计描述

    数据

    处理

    需求分析

    数据字典、数据项、数据流、数据存储的描述

    数据流图和判定树、数据字典中处理过程的描述

    概念结构设计

    概念模型(ER)、数据字典

    系统说明书 (系统要求、方案、概图、数据流图)

    逻辑结构设计

    某种数据模型(如关系)

    系统结构图(模块结构)

    物理设计

    存储安排、方法选择、存取路径建立

    模块设计

    实施阶段

    编写模式、装入数据、数据库试运行

    程序编码、编译联结、测试

    运行维护

    性能监测、转储/恢复、数据库重组和重构

    新旧系统转换、运行、维护

    2,需求分析

    2.1,需求分析及其任务

    需求分析就是分析用户的需求:设计数据库的起点,结果是否准确地反映了用户的实际要求,将直接影响到后面各个阶段的设计,并影响到设计结果是否合理和实用。

    需求分析的任务:数据库设计人员和用户双方共同收集信息需求和处理需求;通过仔细分析;将这些需求按一定的规范要求以用户和设计人员都能理解接受的文档形式确定下来。

    2.2,需求分析的方法

    需求分析的三个步骤:

    需求调查: 收集需求信息, 调查清楚用户的实际要求, 与用户达成共识。

    分析、整理和表达这些需求信息,形成需求说明书(例如,包括DFD和DD等)。

    评审:由主管部门和专家评价、审批。

    需求调查

    需求调查的目的:主要是了解企业的组织机构设置, 各个组织机构的职能、工作目标、职责范围,主要业务活动及大致工作流程,获得各个组织机构的业务数据及其相互联系的信息,为分析整理工作做好前期基础工作

    需求调查的内容:组织机构的情况组成, 职责, 作用, 现状, 问题,哪些业务适合计算机管理, 哪些不适合各个部门的业务活动现状(调查的重点):  输入和使用的数据, 加工处理方法, 数据的流程, 输出的数据及格式, 注意收集原始数据资料, 如台帐、单据、发票、收据、统计报表、文档、档案等。外部要求:调查数据处理的响应时间、频度和如何发生的规则,以及经济效益的要求,安全性和完整性的要求。协助用户明确对新系统的各种要求(调查的又一个重点): 信息要求, 处理要求, 安全性要求, 完整性要求, 未来规划中对数据的应用需求等。确定新系统的边界: 哪些由计算机完成, 哪些由人工完成。

    需求调查的步骤:调查组织机构情况。②调查各部门的业务活动情况。③协助用户明确对新系统的各种要求,包括信息要求、处理要求、完全性与完整性要求。④确定新系统的边界。

    需求调查的方式:跟班作业:通过亲身参加业务工作了解业务活动的情况。开调查会:通过与用户座谈来了解业务活动情况及用户需求。专人介绍。询问:某些调查中的问题,可以找专人询问。设计调查表请用户填写:调查表设计合理,则很有效。查阅记录:查阅与原系统有关的数据记录。

    需求调查策略:

    • 对高层负责人的调查: 一般采用个别交谈方式, 先给一份详细的调查提纲, 以便有所准备。
    • 对中层管理人员的调查: 可采用开座谈会, 个别交谈, 发调查表, 查阅记录的调查方式。
    • 对基层业务人员的调查: 主要采用发调查表, 个别交谈或跟班作业的调查方式。

    分析整理

    分析整理的工作:

    业务流程分析和表示

    • 目的是获得业务流程及业务与数据联系的形式描述。
    • 采用数据流层次结构分析法(SA)
    • 分析结果以数据流图(DFD)表示, 再辅以数据字典(DD)作补充描述

    需求信息的补充描述

    • 数据字典: 主要用于概念结构设计。
    • 业务活动清单: 列出每一部门中最基本的工作任务。
    • 其他需求清单: 如完整性、安全性、一致性要求

    撰写需求分析说明书

    分析整理的方法:结构化分析方法(SA方法)

    SA方法从最上层的系统组织机构入手,采用自顶向下、逐层分解的方式分析系统。

    SA步骤:a)先把任何一个系统都抽象为DFD图形式。b)然后从最上层的系统组织机构入手,采用自顶向下,逐步分解,逐步求精的方式分析系统,获得多层DFD图。

    数据流图(DFD)

    https://shao12138.blog.csdn.net/article/details/109103706#t2

    数据字典(DD)

    https://shao12138.blog.csdn.net/article/details/109103706#t4

    3,概念结构设计

    3.1,概念模型

    概念结构设计:需求分析得到的用户需求抽象为信息结构(即概念模型)的过程。

    目前应用最普遍的是实体关系(E-R)模型,它将现实世界的信息结构统一用属性、实体以及它们之间的联系来描述

    3.2,E-R概念模型

    https://shao12138.blog.csdn.net/article/details/103659528

    3.3,概念结构设计

    实体与属性的划分

    为了简化E-R图的处置,现实世界的事物能作为属性对待的,尽量作为属性对待

    两条准则:作为属性,不能再具有需要描述的性质。属性必须是不可分的数据项,不能包含其他属性。属性不能与其他实体具有联系,即E-R图中所表示的联系是实体之间的联系。

    4,逻辑结构设计

    4.1,逻辑结构设计概述

    逻辑结构设计的任务:概念结构转换成特定DBMS所支持的数据模型的过程。关系数据库逻辑设计的结果是一组关系模式的定义

    逻辑结构设计的步骤:

    概念结构转换为一般的关系、网状、层次模型;

    转换来的关系、网状、层次模型向特定DBMS支持下的数据模型转换;

    数据模型进行优化

    关系数据库逻辑设计的步骤

    概念模型(例如基本E-R)转换为关系模式的集合 --- 得到关系数据库模式;

    运用关系数据理论对关系数据库模式进行规范化处理;

    关系数据库模式进行评价;

    关系数据库模式进行修正;

    设计关系子模式 --- 视图

    4.2,ER图向关系模型的转换

    一个实体转换为一个关系模式

    原则:关系的属性=实体型的属性;关系的码=实体型的码;关系模式的码(用下横线标出) = 实体型的码

    转换为:学生(学号,姓名,系别)

    每个联系类型转换为独立的关系模式

    原则:关系模式的属性 = 与该联系相连的各实体型的+该联系自身的属性;关系模式的码(用下划线标出) = 各实体型的码;

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

    转换为一个独立的关系模式,原则关系模式的属性 = 与该联系相连的各实体型的码  联系自身的属性;关系模式的码(用下划线标出) = 各实体型的码;

    与某一端实体对应的关系模式合并,原则:合并后关系的属性=加入对应关系的码和联系本身的属性;合并后关系的码不变;

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

    转换为一个独立的关系模式,原则关系模式的属性 = 与该联系相连的各实体型的码  联系自身的属性;关系模式的码(用下划线标出) = n端实体的码;

    与某一端实体对应的关系模式合并,原则:合并后关系的属性=n端关系中加入1端关系的码和联系本身的属性;合并后关系的码不变;

    ③一个m:n联系必须转换为一个独立的关系模式

    转换为一个独立的关系模式,原则关系模式的属性 = 与该联系相连的各实体型的码  联系自身的属性;关系模式的码(用下划线标出) =各实体码的组合;

    三个或三个以上实体间的一个多元联系转换为一个关系模式,原则关系模式的属性 = 与该联系相连的各实体型的码  联系自身的属性;关系模式的码(用下划线标出) =各实体码的组合;

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

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

    合并方法:

    • 将其中一个关系模式的全部属性加入到另一个关系模式中
    • 然后去掉其中的同义属性(可能同名也可能不同名)
    •  适当调整属性的次序

    把每一个实体装换为一个关系

    首先分析各实体的属性,从中确定其主键,然后分别用关系模式表示。

    实体:学生	对应的关系:学生(学号,姓名,性别,年龄)
    实体:课程	对应的关系:课程(课程号,课程名)
    实体:教师	对应的关系:教师(教师号,姓名,性别,职称)
    实体:系		对应的关系:系(系名,电话)

    把每一个联系装换为关系模式

    4个联系转换为关系模式,其中2个多对多类型的联系转换为独立关系模式,2个一对多的联系也转换为独立的关系模式。

    联系:属于	对应的关系:属于(教师号,系名)
    联系:讲授	对应的关系:讲授(教师号,课程号)
    联系:选修	对应的关系:选修(学号,课程号,成绩)
    联系:拥有	对应的关系:拥有(学号,系名)
    

    画出关系图

    4.3,数据模型的优化

    数据库逻辑设计的结果不是唯一的,得到初步数据模型后,还应该适当地修改、调整数据模型的结构,以进一步提高数据库应用系统的性能,这就是数据模型的优化。

    规范化过程可分为两个步骤:确定范式级别,实施规范化处理

    确定数据依赖写出每个关系模式内部各属性之间的数据依赖;写出不同关系模式的属性(外码和主码)之间的数据依赖;

    对于各个关系模式之间的数据依赖进行极小化处理,消除冗余的联系。

    按照数据依赖的理论对关系模式进行分析,考察是否存在部分函数依赖、传递函数依赖、多值依赖等,确定各关系模式分别属于第几范式。

    按照需求分析阶段得到的各种应用对数据处理的要求,分析对于这样的应用环境这些模式是否合适,确定是否要对它们进行合并或分解。(并不是规范化程度越高的关系就越优。当一个应用的查询中经常涉及到两个或多个关系模式的属性时,系统必须经常地进行连接运算,而连接运算的代价是相当高的,可以说关系模型低效的主要原因就是做连接运算引起的,因此在这种情况下,第二范式甚至第一范式也许是最好的。

    对关系模式进行必要的分解,提高数据操作的效率和存储空间的利用率。常用的两种分解方法是水平分解垂直分解

    • 水平分解:(基本)关系的元组分为若干子集合,定义每个子集合为一个子关系,以提高系统的效率。
    • 垂直分解:把关系模式R的属性分解为若干子集合,形成若干子关系模式。

    4.4,设计用户子模式(外模式)

    概念模型转换为逻辑模型(数据库模式), 还应根据局部应用的需求, 结合具体DBMS的特点, 设计用户的外()模式 。利用RDBMS提供的视图(View)功能设计

    定义用户外模式时应该更注重考虑用户的习惯与方便。包括三个方面:使用更符合用户习惯的别名。针对不同级别的用户定义不同的视图,以保证系统的安全性。简化用户对系统的使用。

    视图:https://shao12138.blog.csdn.net/article/details/109584275#t23

    5,物理结构设计

    数据库的物理结构:数据库在物理设备上的存储结构与存取方法称为数据库的物理结构,它依赖于选定的数据库管理系统。

    数据库的物理设计:一个给定的逻辑数据模型选取一个最适合应用要求的物理结构的过程,就是数据库的物理设计。

    数据库物理设计的步骤:确定数据库的物理结构,在关系数据库中主要指存取方法和存储结构;物理结构进行评价,评价的重点是时间和空间效率;若评价结果满足原设计要求,则可进入到物理实施阶段。否则,就需要重新设计或修改物理结构,有时甚至要返回逻辑设计阶段修改数据模型

    5.1,数据库物理设计的内容和方法

    准备工作:要充分了解应用环境,详细分析要运行的事务。以获得选择物理数据库设计所需要的参数。分析数据库查询事务需要的信息、数据更新事务需要的信息、每个事务在各关系上运行的频率和性能要求等。要充分了解所用的 DBMS的内部特征, 特别是系统提供的存取方法和存储结构。

    内容:为关系模式选择存取方法,即要确定选择哪些存取方法,建立哪些存取路径。设计关系()、聚簇、索引、日志、备份等数据的物理存储结构。

    5.2,关系模式存取方法选择

    数据库系统是多用户共享的系统,对同一个关系要建立多条存取路径才能满足多用户的多种应用要求。

    数据库关系系统:B+树索引存取方法;②Hash索引存取方法;③聚簇存取方法;

    B+树索引

    选择索引存取方法 就是根据应用要求确定对哪些属性列建立索引、对哪些属性列建立组合索引、对哪些索引要设计为唯一索引。

    选贼索引存取方法的一般规则:

    • 如果一个(或一组)属性经常在查询条件中出现,则考虑在这个(或这组)属性上建立索引(或组合索引
    • 如果一个属性经常作为最大值和最小值等聚集函数的参数,则考虑在这个属性上建立索引
    • 如果一个(或一组)属性经常在连接操作的连接条件中 出现,则考虑在这个(或这组)属性上建立索引

    关系上定义的索引数过多会带来较多的额外开销,无论是维护还是查找

    HASH存取方法

    选择Hash存取方法的规则:如果一个关系的属性主要出现在等值连接条件中或主要出现在等值比较选择条件中,而且满足下列两个条件之一

    • 该关系的大小可预知,而且不变;
    • 该关系的大小动态改变,但所选用的数据库管理系统提供了动态Hash存取方法。

    聚簇存取方法

    为了提高某个属性(或属性组)的查询速度,把这个或这些属性(称为聚簇码)上具有相同值的元组集中存放在连续的物理块上,称为聚簇。该属性(或属性组)称为聚簇码。许多关系型数据库管理系统都提供了聚簇功能。

    聚簇索引:建立聚簇索引后,基表中数据也需要按指定的聚簇属性值的升序或降序存放。也即聚簇索引的索引项顺序与表中元组的物理顺序一致。一个数据库可以建立多个聚簇,一个关系只能加入一个聚簇。

    聚簇索引的适用条件:很少对基表进行增删操作;很少对其中的变长列进行修改操作;

    聚簇索引的用图:

    • 大大提高按聚簇属性进行查询的效率
    • 节省存储空间:聚簇以后,聚簇码相同的元组集中在一起了,因而聚簇码值不必在每个元组中重复存储,只要在一组中存一次就行了。

    聚簇索引的局限性:

    • 聚簇只能提高某些特定应用的性能
    • 建立与维护聚簇的开销相当大;已有关系建立聚簇,将导致关系中元组的物理存储位置移动,并使此关系上原有的索引无效,必须重建。当一个元组的聚簇码改变时,该元组的存储位置也要做相应改变

    聚簇索引的适用范围:

    • 既适用于单个关系独立聚簇,也适用于多个关系组合聚簇
    • 通过聚簇码进行访问或连接是该关系的主要应用,与聚簇码无关的其他访问很少或者是次要的时,可以使用聚簇。尤其SQL语句中包含有与聚簇码有关的ORDER BY, GROUP BY, UNION, DISTINCT等子句或短语时,使用聚簇特别有利,可以省去或减化对结果集的排序操作

    设计候选聚簇:在一起进行连接操作的关系可以建立组合聚簇;

    如果一个关系的一组属性经常出现在相等比较条件中,则该单个关系可建立聚簇;

    如果一个关系的一个(或一组)属性上的值重复率很高,则此单个关系可建立聚簇

    检查候选聚簇索引中的关系,取消不必要的关系

    聚簇中删除经常进行全表扫描的关系

    从聚簇中删除更新操作远多于连接操作的关系

    聚簇中删除重复出现的关系

    5.3,确定数据库的存储结构

    确定数据库物理结构主要指确定数据的存放位置和存储结构,包括:确定关系、索引、聚簇、日志、备份等的存储安排和存储结构,确定系统配置等。

    影响数据存放位置和存储结构的因素:硬件环境和应用需求;要综合考虑存取时间、存储空间利用率和维护代价(这三个方面常常是相互矛盾的。比如:消除一切冗余数据虽能够节约存储空间和减少维护代价,但往往会导致检索代价的增加。必须进行权衡,选择一个折中方案。

    确定数据的存放位置

    原则:根据应用情况将易变部分与稳定部分分开存放,经常存取部分与存取频率较低部分分开存放。

    可以将日志文件与数据库对象(表、索引等)放在不同的磁盘以改进系统的性能。

    可以将比较大的表分别放在两个磁盘上,以加快存取速度,这在多用户环境下特别有效。

    数据库数据备份、日志文件备份等由于只在故障恢复时才使用,而且数据量很大,可以考虑存放在磁带上。

    确定系统配置

    ①系统都为这些变量(同时使用数据库的用户数、同时打开的数据库对象数、内存分配参数、缓冲区分配参数(使用的缓冲区长度、个数)、存储分配参数 、物理块的大小、物理块装填因子、时间片大小、数据库的大小、锁的数目等)赋予了合理的缺省值。在进行物理设计时需要根据应用环境确定这些参数值,以使系统性能最优。

    ②在物理设计时对系统配置变量的调整只是初步的,要根据系统实际运行情况做进一步的调整,以切实改进系统性能。

    5.4,评价物理结构

    评价物理数据库的方法完全依赖于所选用的DBMS

    评价内容:

    • 对数据库物理设计过程中产生的多种方案进行细致的评价;
    • 定量估算各种方案的存储空间、存取时间、维护代价;
    • 对估算结果进行权衡、比较,从中选择一个较优的合理的方案作为数据库的物理结构。

    6,数据库的实施和维护

    6.1,数据的载入和应用程序的调试

    数据库实施阶段主要工作:

    ①建立实际的数据库结构。DDL定义数据库:定义基本表、索引、约束、视图等;

    ②装入数据,组织数据入库(又称数据库加载),组织数据入库是数据库实施阶段最主要的工作。

    • 数据装载方法:人工方法;计算机辅助方法
    • 数据筛选、输入、转换(工具)、校验,确保正确

    ③编制和调试数据库应用程序。数据库应用程序的设计应该与数据库设计并行进行。数据库结构建立好后,就可以开始编制与调试数据库的应用程序。

    6.2,数据库的试运行

    数据库的试运行:应用程序调试完成,并且已有一小部分数据入库后,就可以开始对数据库系统进行联合调试,也称数据库的试运行。

    主要工作包括

    功能测试:实际运行应用程序,执行对数据库的各种操作,测试应用程序的各种功能。

    性能测试:测量系统的性能指标,分析是否符合设计目标。

    数据库性能指标的测量

    数据库物理设计阶段在评价数据库结构估算时间、空间指标时,作了许多简化和假设,忽略了许多次要因素,因此结果必然很粗糙。

    数据库试运行则是要实际测量系统的各种性能指标(不仅是时间、空间指标),如果结果不符合设计目标,则需要返回物理设计阶段,调整物理结构,修改参数;有时甚至需要返回逻辑设计阶段,调整逻辑结构。

    数据的分期入库

    重新设计物理结构甚至逻辑结构,会导致数据重新入库

    由于数据入库工作量实在太大,所以可以采用分期输入数据的方法

    • 先输入小批量数据供先期联合调试使用
    • 待试运行基本合格后再输入大批量数据
    • 逐步增加数据量,逐步完成运行评价

    数据库的转储和恢复

    在数据库试运行阶段,系统还不稳定,硬、软件故障随时都可能发生

    系统的操作人员对新系统还不熟悉,误操作也不可避免

    因此必须做好数据库的转储和恢复工作,尽量减少对数据库的破坏

    6.3,数据库的运行和维护

    在数据库运行阶段,对数据库经常性的维护工作主要是由数据库管理员完成的,包括:

    数据库的转储和恢复

    • 数据库管理员要针对不同的应用要求制定不同的转储计划,定期对数据库和日志文件进行备份。
    • 一旦发生介质故障,即利用数据库备份及日志文件备份,尽快将数据库恢复到某种一致性状态

    数据库的安全性、完整性控制

    初始定义

    • 数据库管理员根据用户的实际需要授予不同的操作权限
    • 根据应用环境定义不同的完整性约束条件

    修改定义

    • 当应用环境发生变化,对安全性的要求也会发生变化,数据库管理员需要根据实际情况修改原有的安全性控制
    • 由于应用环境发生变化,数据库的完整性约束条件也会变化,也需要数据库管理员不断修正,以满足用户要求

    数据库性能的监督、分析和改进

    在数据库运行过程中,数据库管理员必须监督系统运行,对监测数据进行分析,找出改进系统性能的方法。

    • 利用监测工具获取系统运行过程中一系列性能参数的值
    • 通过仔细分析这些数据,判断当前系统是否处于最佳运行状态
    • 如果不是,则需要通过调整某些参数来进一步改进数据库性能

    数据库的重组织与重构造

    数据库的重组织

    • 为什么要重组织数据库   数据库运行一段时间后,由于记录的不断增、删、改,会使数据库的物理存储变坏,从而降低数据库存储空间的利用率和数据的存取效率,使数据库的性能下降
    • 重组织的形式:全部组织和部分组织,只对频繁增、删的表进行重组织
    • 重组织的目标:提高系统性能

    数据库的重构造

    • 为什么要重构造数据库  数据库应用环境发生变化,会导致实体及实体间的联系也发生相应的变化,使原有的数据库设计不能很好地满足新的需求。
    • 重构造的主要工作  根据新环境调整数据库的模式和内模式增加或删除某些数据项改变数据项的类型、增加或删除某个表、改变数据库的容量、增加或删除某些索引。
    • 重构造数据库的程度是有限的  应用变化太大,已无法通过重构数据库来满足新的需求,或重构数据库的代价太大  表明现有数据库应用系统的生命周期已经结束,应该重新设计新的数据库应用系统了。
    展开全文
  • 进销存系统数据库设计用Power Designer完成进销存管理信息系统的数据库建模 包括CDM(E-R图)、PDM(关系模式图)和表清单,生成数据库(SQL 语句)
  • 大型网站数据库设计sql,下载运行即可使用参考,完美注释,清晰字段名
  • 数据库设计解决方案入门经典

    千次下载 热门讨论 2014-10-14 14:30:36
    数据库设计解决方案入门经典
  • 游戏数据库设计经验

    万次阅读 多人点赞 2019-07-13 18:31:18
    一、游戏模板数据库设计特点 软件行业一般数据库设计原则,”保持数据的完整性一致性“,”避免数据冗余“,”范式设计“。但游戏领域的游戏模板表设计上还需要考虑这些特点 1.1、对游戏程序只读,游戏程序只需要...

    一、游戏模板数据库设计特点

        软件行业一般数据库设计原则,”保持数据的完整性一致性“,”避免数据冗余“,”范式设计“。但游戏领域的游戏模板表设计上还需要考虑这些特点

    1.1、对游戏程序只读,游戏程序只需要考虑读取性能,不需要过多考虑修改性能

    1.2、数据结构复杂,如果过于追求“去冗余”,则会导致表结构非常复杂,策划将难以填写

    1.3、很多项目是采用Excel录入的,即使你设计的结构考虑了重用性,策划依然会冗余的填写

    1.4、大量的与程序约定的参数潜规则,程序员往往为了系统的灵活性,而抽象出一些配置,会放入模板表中,而这些对策划来说是晦涩难懂的,建议做详细备注

    1.5、程序事先读入内存,读取模板数据的方式,大部分的时候不会使用SQL的select,而常见的做法是事先读入内存,有的是实例化各种对象,有的是哈希表,有的数据数组,很少会在程序中嵌入一个SQL引擎去查询数据

    所以游戏模板库的设计,一般会在传统数据库设计原则基础上,做很多的灵活设计,这是由于游戏产品的特殊性决定的

    二、设计范式

        不管怎么说毕竟还是数据库设计,设计范式作为基本设计理念还是要重温一下
    2.1、第一范式,确保每列保持原子性,即列不可分,比如这些信息:”张三、战士、5级、绿装、50攻击力….“ 我们设计这样的结构

    玩家

    职业

    级别

    装备

    攻击力

    张三

    战士

    5

    绿色头盔

    50攻击力

        但是这样装备字段里包括了多个信息,所以我们改成这样,就可以符合第一范式了

    玩家

    职业

    级别

    装备品质

    装备

    攻击力

    张三

    战士

    5

    绿色

    头盔

    50攻击力

    2.2、第二范式,属性完全依赖于主键,比如有这样一个数据结构

    玩家

    职业

    级别

    装备品质

    装备

    攻击力

    技能

    技能图标

    张三

    战士

    5

    绿色

    头盔

    50攻击力

     普攻

    a.png

        这里面包括了玩家、装备、技能3类信息,当一个玩家有多个装备,且有多个技能的时候,这张表难以表达清楚逻辑关系。所以改成这样3张表,这样可以清楚的表达

    2.3、第三范式,属性和主键不能间接相关,比如上面的数据结构,装备的攻击力只与装备关系,技能图标只与技能关系,所以改成这样就可以了,独立一个描述装备表和技能表,然后玩家和他们之间建立关系表来表达他们直接的多对多关系。

    三、游戏模板库设计

    3.1、数组属性
        一般一个字段放一个属性值,如果要表达一个数组类的属性怎么设计呢?一般的设计是建立一个独立的表,方便各种select

         

    但是游戏库往往不需要反向查询,只需要存储一个数组数据,这时我们可以采用简单的存储方案

    这两种方案的选择,各有特点

        一般选择的话看需不需要考虑属性的扩展? 需不需要按属性分析? 需不需要对单个属性进行修改。比如一个玩家成就列表,我们可能就会放入一个字段,因为一般不会按成就查询且没有扩展属性。而玩家的任务我们会放入一个表,因为会扩展出接任务的时间、任务完成进度等属性

    案例:

        场景对象表中需要描述对象的交互范围 填1代表圆形范围后面跟半径参数,填2代表矩形范围,后面跟宽、高参数。这样我们会选择一个属性的设计。(注意 这个vector<int>,在数据库里一般是varchar类型,我这个是概念设计图)

    里面的数据大概是这样的

     

     

    3.2、单主键还是复合主键

        首先看程序的要求,有的项目出于某种原因,强制要求所有表必须单主键。比如分布式数据库的要求,或为了方便程序实例化对象。如果项目可以允许复合主键的话,可以充分利用好这类设计。

        约束的设计意义在于是否可以帮助业务帮助程序识别一条记录,比如这张表

    一般有3个设计方案

    方案1、你可以选择加一个自增长的单键来设计,但这样对读取数据没有任何好处,只是多了一个冗余的id

    方案2、如果“物品编号”是唯一标识的,你可以设置为单键,但似乎对索引没有任何好处,因为大部分情况下会按玩家编号查询,这里你还需要建立一个玩家编号的索引,还是冗余了一个索引数据,不过比上一个方案好

    方案3、如果条件允许,可以设置为玩家编号、物品编号 的复合主键,既可以解决标识问题,又可以解决索引问题

    案例:

        先讨论Dialog表,业务是“一次对话有多句话”,程序一般在读取的时候是按对话ID来一次读取的,所以这里直接设计了一个双主键来表达这个业务。

        再来看NPC功能表,业务是“一个NPC有多个业务功能,且业务功能会根据玩家的选择而进一步扩展”,为了达到这个“进一步扩展”需要设计一个用户表达树形结构的自关联,如果这个表是复合主键的话,会导致外键也需要是复合的,会产生冗余字段,另外有考虑到有可能存在多个NPC共用一套NPC功能的可能性(比如一个NPC在两个的场景中都会出现,或者两个NPC都有进多人副本的功能),所以这里设计了单主键

     

    3.3、范围结构的表达

    比如数据是这样的

    分数下限

    分数上限

    奖励

    0

    100

    5

    101

    200

    10

     

     

    一般来说有2种设计方法,

        一个是按一边维护比如按上限设计,这样在两段数据之间绝对不会有间隙,而且没有冗余数据,但是看起来需要结合上下文来理解。

        另一个是按上下限来设计,好处是程序写起来方便,读起来简单。但是这样可能存在间隙,比如100.5这种,特别是日期时间,策划不可能填精确到毫秒的时间。

    案例:

        一个技能根据,技能等级会有不同的数值变化,而这些变化是按等级段来的,比如10级内都是+10点攻击力,20级内都是加30点攻击力。

        这个表主要是为程序服务的,等级也不可能出现小数也就没有间隙问题,所以冗余了上下限的属性,另外为了程序用起来方便还加了等级段顺序属性(其实上下限的值就是顺序的,所以是冗余的)。

     

    3.4、树形结构的表达

    比如数据是这样的

    最基本的设计方案是"邻接表"

    但是为了方便程序的查询或者修改,一般会有各种冗余设计方案,这里举3个例子

    1、枚举路径,在数据中像路径一样把,每个节点的路径都写出来,优点是查询的时候只需要select like 查询就可以了,但缺点是修改节点之间的关系,可能需要重建相关的其他数据的路径,比如迁移一个子树到另一个根节点下,需要改变整个子树的路径。

    2、冗余根节点,这个设计方案就是一般是用在只按整个树查询的情形下,按根节点读取起来方便

    3、闭包表,这个设计完全是为了方便程序读取,有的程序为了在界面上展示一个树形结构会这样要求冗余数据,有时还会要求冗余一个层级的字段来表达是第几层的。但这种设计修改起来非常容易出错,且不易读。真的遇到需要这种设计,还是建议程序员自己在内存里生成这种结构,以保证数据维护的质量

    案例:

         这里举个技能行为的例子,业务是“一个行为后,接下一个行为,但QTE成功后行为是另一个”,我们也可以按最传统的结构表达出这个业务,但策划在用Excel填写的时候不直观,所以在当前行为下记录了下一个节点,而不是上一个。这个设计很像数据结构里的二叉树结构,也方便程序的读取。

        另一个案例看刚才的NPC功能表,同样为了Excel维护方便,程序读取简单,采用了记录下一个节点的方案,但这里的可能存在多个下级功能,所以用了前面说的数组属性,来避免多一张关系表

     

    3.5、对象的设计

    比如有这样一个玩家类,有两个子类机器人、VIP玩家,继承与玩家。我们如何表达这种设计

    这里列5种方案

    1、单表。就是用一张表把所有属性放进去,优点易于维护,缺点会有冗余数据

    2、独立实体表。就是完全分开两个不同的表,相同的部分,冗余到两张表里,这样缺点是如果子类多,容易产生很多类似的表,后续修改表结构起来需要同时维护。

    3、类-表映射。就是和类一样设计3张表,优点是逻辑清晰,没有冗余数据,但维护数据起来需要改多张表

    4、范型属性表。这个设计非常灵活扩展非常好,但对应的维护起来基本不用工具是很难维护的。实际工作中只用来解决未知的扩展用。

    5、半结构化属性表。这个也是牺牲了维护性,追求扩展性的设计,大文本里一般是类似json,xml之类的,一般用在非常复杂的参数扩展上

    案例:

        场景对象里有可以包括普通怪物、NPC、不可见的触发区域、城堡、宝箱等等。

        很多对象的属性是差不多的,而其中有几类对象是会自己移动的,比如巡逻怪,NPC等。所以我们的行为树和移动速度放直接放在主表里,方便共用与维护。

        而NPC又有许多特殊的属性,且会有进一步的扩展功能,所以这里建立了一个1对0..1的NPC扩展表。在表达这1对0..1关系一般有3种,比较常见的是在子表里和主表的键的数据一致,既是主键也是外键。另外就是子表里放主表的键,这样子表的键比较自由,可以用自增ID。另一种是在主表里放子表的键,数据会有冗余。这里为了方便策划维护所以采用了后者

     

    3.6、多对多关系

    最常见的多对多关系就是采用关系表了,比如这样

        这种传统设计完全复合范式设计理念,扩展性非常好,可以在关系表上扩展其他属性,同时也方便各种SQL的select查询

        而在游戏模板表里,如果只是单纯的多对多关系,业务上不需要扩展的话,更多是采用数组方案。在策划填表上优势非常明显,非常利于策划的填写,而不需要频繁的在不同excel中切换

    案例:

        场景对象在不同的状态下,对不同的阵营有不同的行为。比如我们有3个阵营友好、敌对、中立,另有3个状态普通、战斗、死亡,那就会有9种排列组合。

    对象

    阵营

    状态

    动作

    A

    友好

    普通

    动作A

    A友好敌对动作B

       我们在设计这个表的时候用了这个结构

        首先把阵营做为数组放在场景对象表上了,然后按不同状态定义不同的动作扩展属性。这个设计相当于把阵营解耦到对象表上了,这是因为业务上”非PVP玩法的时候的时候,很多对象对不同阵营是对应一个状态动作的组合“,这样避免了动作扩展属性数据冗余,填起来也方便。

    四、模板库设计的其他经验

    4.1、设计好了策划不一定会按设计的来填写

    比如有个多语言的表,设计师是想,一段多语言的文字只要内容相同的情况下是可以复用的

    而策划填的时候往往为了方便,每个都去新增一行,根本没有去看看表里是不是已经存在了可以复用。

    这类现象在填表的时候非常普遍,有的是为了方便维护,有的是怕后续会发生变化会相互影响,但也有是没有去冗余意识

    最好的情形是策划填表的时候发现冗余数据太多,找设计师改设计。

    4.2、为了避免小数使用万分比,而不使用百分比

    因为模板表程序用的时候可能会经过各种导表工具给程序用,用小数容易出现数值差异,特别是各种概率

    4.3、建议使用设计工具维护一个数据字典,而不是依赖Excel

    这里建议使用Power Designer,或 ER Studio之类的工具把表设计给存下来,方便设计师与技术、策划的交流

    五、总结

        大家通过案例可以看到,实际在做游戏数据库设计时,是需要根据业务灵活的使用各种设计方案。而不是固定的按某个固定的设计范式进行设计,甚至在表达一个业务时需要同时结合多种设计方案。
        另外就是调整,任何设计都是可能需要调整的,即使完全满足当前设计需求,也有可能随着业务变化而需要设计调整,这个是永远避免不了的。
        没有完美的设计,好的设计师是在各种约束条件下找到一个设计平衡点,来达到业务目的。

    展开全文
  • 学生成绩管理系统数据库设计--MySQL

    万次阅读 多人点赞 2020-06-18 13:02:04
    MySQL/SQL Server 数据库设计(学生成绩管理系统) 设计大纲 1. 项目背景及需求分析 1.1 项目背景 1.2 需求分析 1.2.1 信息需求 1.2.2 功能需求 1.2.3 安全性与完整性需求 2. 概念结构设计 2.1 抽象出系统实体 2.2 ...

    MySQL 数据库设计-学生成绩管理系统

    设计大纲

    在这里插入图片描述

    更新时间:2020.6.23

    1. 项目背景及需求分析

    1.1 项目背景

    为了深刻的理解MySQL数据库,以学生成绩信息管理为例,设计一个简单、规范、高效的学生成绩信息管理系统数据库。

    1.2 需求分析

    1.2.1 信息需求

    对学校而言,学生成绩管理是管理工作中重要的一环,但是高校学生的成绩管理工作量大、繁杂,人工处理非常困难。因此,借助于强大计算机的处理能力,能够把人从繁重的成绩管理工作中解脱出来,并且更加准确、安全、清晰的管理环境。

    1.2.2 功能需求

    能够进行数据库的数据定义、数据操纵、数据控制等处理功能。具体功能应包括:可提供课程安排、课程成绩数据的添加、插入、删除、更新、查询,学生及教职工基本信息查询的功能。

    1.2.3 安全性与完整性要求

    对于学生成绩管理系统数据库来讲,由于其主要数据是学生成绩,只能由本人以及所教老师及教务处知道,因此做好数据安全性是重中之重。另外,要求所有在校学生的信息都要录入其中,并且要设计好个别情况。

    2. 概念结构设计

    概念结构设计是整个数据库设计的关键,它通过对用户需求进行综合、归纳与抽象,形成一个独立于具体DBMS的概念模型。
    根据学生成绩信息管理数据库设计需求抽象出学生、教师、课程、成绩四个实体,对四个实体做简化处理,默认一门课程仅被一位老师讲授。因简化后关系结构比较简单,故省略了局部E-R图。对4个实体之间的关系进行分析如下:
    一位学生会被多位老师教导,一位老师会教导多位学生,所有学生与教师之间是多对多(m:n)的关系;
    一位学生可能会选修多门课程,一门课程会被多位学生选修,所以学生与课程之间是多对多(m:n)的关系;
    一位学生会有多项成绩(具体指某学生一门课程的分数),一项成绩仅被一位学生拥有,所以学生与成绩是一对多(1:n)的关系;
    一位教师会讲授多门课程,一门课程会被一位教师讲授,所以教师与课程的关系是一对多(1:n)的关系;
    一门课程拥有多项成绩,一项成绩仅被一门课程拥有,所以课程与成绩的关系是一对多(1:n)的关系;

    2.1 抽象出系统实体

    学生(学号、姓名、班级、性别、专业、出生日期、学分);
    老师(教师编号、姓名、学院);
    课程(课程编号、教师编号、课程名称、课程学分);
    成绩(学号、课程编号、分数);

    2.2 全局E-R图

    在这里插入图片描述

    3. 逻辑结构设计

    3.1 关系模式

    E-R图向关系模型转化要解决的问题是如何将实体型和实体间的联系转化为关系模式,如何确定这些关系模式的属性和码。
    设计学生成绩管理数据库,包括学生(students)、老师(teachers)、课程(courses)、成绩(scores)四个实体,其关系模式中对每个实体定义属性如下:

    students 表:学号(sid)、姓名(sname)、班级(sclass)、性别(sgender)、专业(smajor)、出生日期(sbirthday)、学分(credit_points),此为联系“students表”所对应的关系模式,学号为该关系的候选码,满足第三范式。

    teachers表:教师编号(tid)、姓名(tname)、学院(tschool),此为联系“teachers表”所对应的关系模式,教师编号为该关系的候选码,满足第三范式。

    courses表:课程编号(cid)、教师编号(tid)、课程名称(cname)、学分(credit_point),此为联系“courses表”所对应的关系模式,课程编号和教师编号为该关系的候选码,满足第三范式。

    scores表:学号(sid)、课程编号(cid)、分数(score),此为联系“scores表”所对应的关系模式,学号和课程编号为该关系的候选码,满足第三范式。

    3.2 函数依赖识别

    后续更新补充

    3.3 范式

    后续更新补充

    3.4 表结构

    数据库中包含4个表,即学生(students)、老师(teachers)、课程(courses)、成绩(scores)。

    students表的表结构
    在这里插入图片描述
    teachers表的表结构
    在这里插入图片描述
    courses表的表结构
    在这里插入图片描述
    scores表的表结构
    在这里插入图片描述

    4. 物理设计和实施

    4.1 数据库及表创建

    4.1.1 创建数据库

    -- 如果已有该数据库,则删除
    DROP DATABASE IF EXISTS StudentScore;
    
    -- 创建数据库
    CREATE DATABASE StudentScore CHARSET=UTF8;
    

    4.1.2 创建数据表

    -- 使用数据库
    USE StudentScore;
    
    -- 创建数据表
    -- table 1: students
    DROP TABLE IF EXISTS students;
    CREATE TABLE students(
    sid INT(20) UNSIGNED PRIMARY KEY AUTO_INCREMENT NOT NULL,
    sname VARCHAR(20),
    sclass INT(10),
    sgender VARCHAR(10),
    smajor VARCHAR(20),
    sbirthday DATE,
    credit_points INT(5) -- 学生已修学分
    );
    
    -- table 2: teachers
    DROP TABLE IF EXISTS teachers;
    CREATE TABLE teachers(
    tid INT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT NOT NULL,
    tname VARCHAR(20),
    tschool VARCHAR(20)
    );
    
    -- table 3: courses
    DROP TABLE IF EXISTS courses;
    CREATE TABLE courses(
    cid INT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT NOT NULL,
    cname VARCHAR(20),
    credit_point INT(5), -- 课程学分
    tid INT(10) UNSIGNED NOT NULL,
    FOREIGN KEY(tid) REFERENCES teachers(tid)
    );
    
    -- table 4: scores
    DROP TABLE IF EXISTS scores;
    CREATE TABLE scores(
    sid INT(10) UNSIGNED NOT NULL,
    cid INT(10) UNSIGNED NOT NULL,
    score DECIMAL(5, 2),
    FOREIGN KEY(sid) REFERENCES students(sid),
    FOREIGN KEY(cid) REFERENCES courses(cid)
    );
    
    

    4.2 表数据增删改查测试

    4.2.1 MySQL基础知识点总结

    在这里插入图片描述

    4.2.2 精选MySQL练习题数据及解析

    点击查看
    4.2.2 精选MySQL练习题数据及答案解析

    4.2.2.1. 连接查询 - 4题

    1.1 查询同时选修了课程 1 和 课程 2 的学生的信息

    1.2 查询课程 1 比 课程 2 成绩高的学生的信息及课程分数

    1.3 查询课程 1 分数小于 60 的学生信息和课程分数,按分数降序排列

    1.4 查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩

    4.2.2.2. 子查询、连接查询 - 4题

    2.1 查询有成绩的学生信息

    2.2 查询学过 孙悟空 老师所授课程的学生信息

    2.3 查询至少有一门课与学号为 1 的同学所学相同的学生信息

    2.4 查询选修了课程 2 但是没有选修课程 1 的学生信息

    4.2.2.3. 聚合分组、连接查询 - 8题

    3.1 查询同名学生名单,并统计同名人数

    3.2 查询选修了 3 门课程的学生信息

    3.3 查询平均成绩大于等于 85 的所有学生的学号、姓名、平均成绩(保留2位小数)

    3.4 查询平均成绩大于等于 60 分的学生学号、姓名、平均成绩(保留2位小数)

    3.5 查询两门及以上课程分数小于60分的学生学号、姓名及平均成绩(保留2位小数)

    3.6 查询姓 赵 的同学的学生信息、总分,若没选课则总分显示为 0

    3.7 查询所有同学的学号、姓名、选课总数、总成绩,没选课的学生要求显示选课总数和总成绩为 0

    3.8 查询所有学生学号、姓名、选课名称、总成绩,按总成绩降序排序,没选课的学生显示总成绩为 0

    4.2.2.4. if 或 case 语句 - 2题

    4.1 若学号sid为学生座位编号,现开始对座位号调整,奇数号和偶数号对调,如1和2对调、3和4对调…等, 如果最后一位为奇数,则不调换座位,查询调换后的学生座位号(sid)、姓名,按sid排序

    4.2 查询各科成绩最高分、最低分和平均分: 以如下形式显示:课程id、课程名、选修人数、最高分、最低分、平均分、及格率、中等率、优良率、优秀率
    及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90
    要求查询结果按人数降序排列,若人数相同,按课程号升序排列,平均分、及格率等保留2位小数

    4.2.2.5. 时间函数 - 6题

    5.1 查询 1990 年出生的学生信息

    5.2 查询各学生的年龄,分别按年份和按出生日期来算

    5.3 查询本周或下周过生日的学生

    5.4 查询本月或下月过生日的学生

    5.5 查询学生信息,要求:学号和年龄同时至少比一位学生的学号和年龄大

    5.6 查询连续相邻3年出生的学生中,学生性别相同的学生信息

    4.2.2.6.综合应用 - 12题

    6.1 查询和学号为 1 的同学学习的课程完全相同的其他同学的信息

    6.2 查询每科均及格的人的平均成绩:学号、姓名、平均成绩(保留2位小数)

    6.3 查询选修 张若尘 老师所授课程的学生中,该门课成绩最高的学生信息及成绩(成绩可能重复)

    6.4 查询各科成绩,按各科成绩进行排序,并显示排名 分数重复时保留名次空缺,即名次不连续

    6.5 查询各科成绩,按各科成绩进行排序,并显示排名 分数重复时不保留名次空缺,即名次连续

    6.6 查询学生 赵雷 的 变形 课程成绩的排名:学生信息,分数,排名 分数重复时不保留名次空缺,即名次连续

    6.7 查询课程 时空穿梭 成绩在第2-4名的学生,要求显示字段:学号、姓名、课程名、成绩 分数重复时不保留名次空缺,即名次连续

    6.8 查询学生的总成绩,并进行排名,总分重复时不保留名次空缺,即名次连续

    6.9 查询学生的总成绩,并进行排名,总分重复时保留名次空缺,及名次不连续 排名名次不连续,不需要去重

    6.10 统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[60-0] 分别所占百分比 结果:保留2位小数

    6.11 查询各科成绩前三名的记录,按照课程编号和分数排序 分数重复时,重复分数按照一名算,即不保留名次空缺,及名次连续

    6.12 查询各科成绩的前两名,列出学生信息、课程名、分数,按照课程名、分数排序 分数重复时,重复分数按照一名算,即不保留名次空缺,及名次连续

    4.2.2.7 MySQL练习题数据及答案解析

    点击查看
    4.2.2 精选36道MySQL练习题数据及答案解析

    4.3 创建视图

    4.3.1 创建一个学生视图,要求显示学生学号、姓名、班级、性别、专业、各科成绩、平均分、总分

    DROP VIEW IF EXISTS v_students_info;
    
    CREATE VIEW v_students_info AS
    SELECT  stu.sid,
    		stu.sname,
    		stu.sclass,
    		stu.sgender,
    		stu.smajor,
    		sum(if(c.cname = "变形", sc.score, 0)) AS "变形",
    		sum(if(c.cname = "时空穿梭", sc.score, 0)) AS "时空穿梭",
    		sum(if(c.cname = "分解术", sc.score, 0)) AS "分解术",
    		sum(if(c.cname = "炼器", sc.score, 0)) AS "炼器",
    		sum(if(c.cname = "炼丹", sc.score, 0)) AS "炼丹",
    		sum(if(c.cname = "飞行", sc.score, 0)) AS "飞行",
    		round(ifnull(avg(sc.score), 0), 2) AS "平均分",
    		ifnull(sum(sc.score), 0) AS "总分"
    FROM 	students stu LEFT JOIN
    		scores sc ON stu.sid = sc.sid LEFT JOIN
    		courses c ON c.cid = sc.cid
    GROUP BY stu.sid;
    

    查看视图:
    在这里插入图片描述
    在这里插入图片描述

    4.4 创建函数

    4.4.1 创建一个通过学号sid获取学生信息的函数

    DROP FUNCTION IF EXISTS get_student_info_by_sid;
    
    DELIMITER //
    CREATE DEFINER = CURRENT_USER FUNCTION get_student_info_by_sid(id INT)
    RETURNS VARCHAR(300)
    DETERMINISTIC
    BEGIN
    RETURN (SELECT CONCAT('姓名: ', sname, ' , ', '性别: ', sgender, ' , ', '专业:', smajor)
    FROM students WHERE sid = id);
    END//
    DELIMITER ;
    -- 调用函数
    SELECT get_student_info_by_sid(8);
    

    调用函数结果:
    在这里插入图片描述
    其中DELIMITER 先定义结束符为 // , 然后又将结束符改为mysql默认的分号结束符。

    了解delimiter 关键字请点击:
    MySQL中 delimiter 关键字详解
    如果出现报错1418:

    Error Code : 1418 This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you might want to use the less safe log_bin_trust_function_creators variable)

    参考下面:
    MySQL ERROR 1418 的解决方法

    4.4.2 自定义函数 2:要求函数体中包含其中一种流程控制语句,要求输入学生学号sid、课程编号,显示学生姓名、课程名称、成绩是否及格(即成绩>=60)

    
    DROP FUNCTION IF EXISTS get_student_scores_by_id;
    
    DELIMITER //
    CREATE DEFINER = CURRENT_USER FUNCTION get_student_scores_by_id(sid INT, cid INT)
    RETURNS VARCHAR(300)
    DETERMINISTIC
    BEGIN
    	-- 多个变量要分开声明,否则会报错
    	DECLARE score INT;
    	DECLARE name VARCHAR(20);
    	DECLARE course_name VARCHAR(20);
    	SELECT sc.score INTO score
    	FROM scores AS sc
    	WHERE sc.sid = sid AND sc.cid = cid;
    	SELECT sname INTO name FROM students AS stu WHERE stu.sid = sid;
    	SELECT cname INTO course_name FROM courses AS co WHERE co.cid = cid;
    	IF score >= 60 THEN
    		RETURN CONCAT(name, '--', course_name, '--', '及格');
    	ELSEIF score > 0 AND score < 60 THEN
    		RETURN CONCAT(name, '--', course_name, '--', '不及格');
    	ELSE
    		RETURN '找不到该学生、课程或该学生没有选课!';
    	END IF;
    END//
    DELIMITER ;
    
    -- 调用函数
    SELECT get_student_scores_by_id(1, 2);
    
    

    调用函数结果:
    在这里插入图片描述

    4.5 创建存储过程

    4.5.1 学生每选修一门课,如果该门课程成绩达到60分及以上,则把该门课程学分加到学生学分里面,输出该学生姓名、学分

    DROP PROCEDURE IF EXISTS add_scores;
    
    DELIMITER //
    CREATE DEFINER = CURRENT_USER PROCEDURE add_scores(
    	IN stu_id INT, 
    	IN co_id INT, 
    	IN s_score INT,
    	OUT name VARCHAR(20),
    	OUT s_credit_point INT
    )
    DETERMINISTIC
    BEGIN
    -- 多个变量要分开声明,否则会报错
    DECLARE points INT;
    INSERT INTO scores (sid, cid, score)
    VALUES (stu_id, co_id, s_score);
    SELECT credit_point INTO points FROM courses WHERE cid = co_id;
    IF s_score >= 60 THEN
    	UPDATE students 
    	SET credit_points = credit_points + points
    	WHERE sid = stu_id;
    END IF;
    -- 注意:多个输出值一定要用多个SELECT来赋值,否则会报错
    SELECT sname INTO name FROM students WHERE sid = stu_id;
    SELECT credit_points INTO s_credit_point FROM students WHERE sid = stu_id;
    COMMIT;
    END//
    DELIMITER ;
    
    -- 测试调用存储过程
    SELECT * FROM students WHERE sid > 10;
    CALL add_scores(11, 2, 33, @name, @s_credit_point);
    SELECT @name, @s_credit_point;
    CALL add_scores(12, 2, 88, @name, @s_credit_point);
    SELECT @name, @s_credit_point;
    
    

    调用存储过程结果:
    在这里插入图片描述

    4.6 创建触发器

    4.6.1 创建一个更新学生学分的触发器,如果该学生分数>=60,则给该学生加上这门课的学分

    语法
    create trigger triggerName
    after/before insert/update/delete on 表名 for each row #这句话在mysql是固定的 begin
    sql语句;
    end;

    
    DROP TRIGGER IF EXISTS update_credit_point;
    
    DELIMITER //
    CREATE TRIGGER update_credit_point
    AFTER INSERT ON scores FOR EACH ROW
    BEGIN 
    	DECLARE points INT;
    	SELECT co.credit_point INTO points FROM courses AS co WHERE co.cid = new.cid;
    	IF new.score >= 60 THEN
    		UPDATE students SET credit_points = credit_points + points
    		WHERE sid = new.sid;
    	END IF;
    END//
    DELIMITER ;
    
    
    -- 测试数据
    SELECT * FROM students WHERE sid < 3;
    INSERT INTO scores VALUES
    (1, 4, 77),
    (2, 4, 55);
    SELECT * FROM students;
    

    测试结果:
    在这里插入图片描述
    终于写完啦!

    展开全文
  • 数据库题目之数据库设计

    千次阅读 多人点赞 2019-01-10 15:21:25
    1、在数据库设计中,用E-R图来描述信息结构但不涉及信息在计算机中的表示,它是数据库设计的 阶段。 A.需求分析 B.概念设计 C.逻辑设计 D.物理设计 【答案:】B 2、在关系数据库设计中,设计关系模式是 的...
  • 本资源为大连理工大学软件学院的数据库设计大作业 背景为某一农产品网上商城系统的数据库设计 图表 说明 SQL语句详尽 各位学弟学妹们可以做以参考
  • 口罩预约管理系统——数据库设计(前端+PHP+MySQL)

    万次阅读 多人点赞 2020-09-14 20:55:54
    口罩预约管理系统(数据库设计)基本功能实现,如何结合前端基础、后端PHP和MySQL数据库实现呢?手把手教你设计数据库,搭建口罩预约管理系统,实现基本需求功能!
  • 数据库设计的过程是将数据库系统与现实世界密切地、有机地、协调一致地结合起来的过程。 数据库的设计质量与设计者的知识、经验和水平密切相关。作为数据库应用系统的重要组成部分,数据库设计的成败往往直接关系到...
  • 个人博客数据库设计

    万次阅读 多人点赞 2019-01-21 11:41:23
    文章目录前言一、 概述及分析1.1 项目背景1.2 分析1.3 系统功能1.3.1 用户管理1.3.2 博文管理1.3.3 评论管理1.3.4 分类管理1.3.5 标签管理二、数据库概念模型设计—基本ER图三、数据库逻辑模型设计四、数据库语句4.1...
  • 仿京东商城数据库设计

    热门讨论 2013-10-16 21:22:39
    大学课内项目仿京东商城数据库设计,可供参考
  • 教务管理系统 数据库设计

    千次下载 热门讨论 2011-12-25 21:52:54
    数据库原理课,设计了一个高校教务管理系统数据库,word文档,包括需求分析,ER图,具体的代码设计,SQL语句的数据库查询,创建视图
  • 微服务的数据库设计

    千次阅读 多人点赞 2019-10-19 09:14:13
    微服务设计的一个关键是数据库设计,基本原则是每个服务都有自己单独的数据库,而且只有微服务本身可以访问这个数据库。它是基于下面三个原因。 优化服务接口:微服务之间的接口越小越好,最好只有服务调用接口...
  • 数据库设计的六个基本步骤

    千次阅读 2021-04-01 15:35:32
    按照规范设计的方法,考虑数据库及其应用系统开发全过程,可将数据库设计分为以下6个阶段,分别为:1.需求分析,2.概念结构设计,3.逻辑结构设计,4.物理结构设计,5.数据库实施,6.数据库的运行和维护。 数据库设计...
  • 数据库设计(一)——数据库设计

    万次阅读 多人点赞 2018-08-30 17:30:34
    一、数据库设计简介 按照规范设计,将数据库的设计过程分为六个阶段:  A、系统需求分析阶段 B、概念结构设计阶段 C、逻辑结构设计阶段 D、物理结构设计阶段 E、数据库实施阶段 F、数据库运行与维护阶段 需求分析...
  • 数据库设计中关系规范化理论总结

    千次阅读 多人点赞 2020-07-31 11:08:14
    在关系数据库设计过程中,最重要的莫过于对数据库的逻辑设计,即针对一个具体的问题,我们应该如何去构造一个适合它的数据库模式。经过科学家的讨论研究,最终形成我们今天所看到的关系数据库的规范化理论。本文...
  • 数据库设计

    万次阅读 2019-09-03 10:48:05
    数据库设计 关系型数据库建议在E-R模型的基础上,我们需要根据产品经理的设计策划,抽取出来模型与关系,制定出表结构,这是项目开始的第一步 在开发中有很多设计数据库的软件,常用的如power designer,db ...
  • 数据库设计教程(第二版)pdf

    千次下载 热门讨论 2012-04-10 15:53:54
    数据库设计教程(第二版)pdf
  • 网上购物商城数据库设计

    热门讨论 2012-12-23 11:33:54
    网上购物商城数据库设计表,写的很详细,有16张表,其中多使用多对多的关联关系,可作参考
  • 数据库设计的一般步骤

    万次阅读 多人点赞 2019-06-13 20:03:58
    经过几天给韶关某个高校进行数据库设计的实训,对数据库设计的过程有了更加深刻的理解。 数据库的设计按照以下步骤: (1)了解功能需求 在设计数据库之前,设计人员必须要先了解系统的功能需求。这里可以通过...
  • 员工管理数据库设计

    万次阅读 多人点赞 2019-07-06 20:56:52
    通过该课题可以熟悉PowerDesigner设计数据库的流程,巩固数据库设计规则和设计原理,以及对数据库进行多种逻辑查询。 二、数据库的需求分析 通过设计数据库实现对企业员工的基本信息、职...
  • 网吧管理系统数据库设计和相关文档网吧管理系统数据库设计和相关文档网吧管理系统数据库设计和相关文档网吧管理系统数据库设计和相关文档以及相关报表网吧管理系统数据库设计和相关文档网吧管理系统数据库设计和相关...
  • 数据库设计的基本步骤

    万次阅读 多人点赞 2017-08-13 20:52:16
    数据库设计的基本步骤 按照规范设计的方法,考虑数据库及其应用系统开发全过程,将数据库设计分为以下6个阶段 1.需求分析 2.概念结构设计 3.逻辑结构设计 4.物理结构设计 5.数据库实施 6.数据库的运行和维护   在...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,396,434
精华内容 558,573
关键字:

数据库设计