数据库课程设计实例

数据库课程设计实例,第1张

数据库课程设计

题目:小型超市管理系统

1、项目计划

1.1系统开发目的

(1)大大提高超市的运作效率;

(2)通过全面的信息采集和处理,辅助提高超市的决策水平;

(3)使用本系统,可以迅速提升超市的管理水平,为降低经营成本, 提高效益,增强超市扩张力, 提供有效的技术保障。

1.2背景说明

21世纪,超市的竞争也进入到了一个全新的领域,竞争已不再是规模的竞争,而是技术的竞争、管理的竞争、人才的竞争。技术的提升和管理的升级是超市业的竞争核心。零售领域目前呈多元发展趋势,多种业态:超市、仓储店、便利店、特许加盟店、专卖店、货仓等相互并存。如何在激烈的竞争中扩大销售额、降低经营成本、扩大经营规模,成为超市营业者努力追求的目标。

1.3项目确立

针对超市的特点,为了帮助超市解决现在面临的问题,提高小型超市的竞争力,我们将开发以下系统:前台POS销售系统、后台管理系统,其中这两个子系统又包含其它一些子功能。

1.4应用范围

本系统适应于各种小型的超市。

1.5 定义

(1)商品条形码:每种商品具有唯一的条形码,对于某些价格一样的商品,可以使用自定义条形码。

(2)交易清单:包括交易的流水账号、每类商品的商品名、数量、该类商品的总金额、交易的时间、负责本次收银的员工号。

(3)商品积压:在一定时期内,远无法完成销售计划的商品会造成积压。

(4)促销:在一定时期内,某些商品会按低于原价的促销价格销售。

库存告警提示:当商品的库存数量低于库存报警数量时发出提示。

(5)盘点:计算出库存、销售额、盈利等经营指标。

1.6 参考资料

数据库原理及设计》 陶宏才编 清华大学出版社

《SQL Server 2000 实用教程》范立南编 清华大学出版社

《SQL Server 2000 编程员指南》李香敏编 北京希望电子出版社

《轻松搞定 SQL Server 2000 程序设计》Rebecca M.Riordan编

《软件工程规范》Watts S.Humphrey编 清华大学出版社

《软件工程理论与实践》 Shari Lawrence Pfleeger编 清华大学出版社

《软件需求分析》 Swapna Kishore编 机械工业出版社

《软件工程思想》 林锐编

2、逻辑分析与详细分析

2.1系统功能

(1)、零售前台(POS)管理系统,本系统必须具有以下功能:

 商品录入:根据超巿业务特点制定相关功能,可以通过输入唯一编号、扫描条形码、商品名称等来实现精确或模糊的商品扫描录入。该扫描录入方法可以充分保证各种电脑 *** 作水平层次的人员均能准确快速地进行商品扫描录入。

 收银业务:通过扫描条形码或者直接输入商品名称(对于同类多件商品采用一次录入加数量的方式)自动计算本次交易的总金额。在顾客付款后,自动计算找零,同时打印交易清单(包括交易的流水账号、每类商品的商品名、数量、该类商品的总金额、交易的时间、负责本次收银的员工号)。如果顾客是本店会员并持有本人会员卡,则在交易前先扫描会员卡,并对所购物品全部实行95折优惠,并将所购物品的总金额累计到该会员的总消费金额中。 会员卡的有效期限为一年,满一年未续卡者,该会员卡将被注销。

 安全性:OS登陆、退出、换班与 *** 作锁定等权限验证保护;断电自动保护最大限度防止意外及恶意非法 *** 作。

 独立作业:有的断网收银即在网络服务器断开或网络不通的情况下,收银机仍能正常作业

(2)、后台管理系统,本系统必须具备以下功能

 进货管理: 根据销售情况及库存情况,自动制定进货计划(亦可手工制定修改),可以避免盲目进货造成商品积压。 按计划单有选择性地进行自动入库登记。 综合查询打印计划进货与入库记录及金额。

 销售管理: 商品正常销售、促销与限量、限期及禁止销售控制。 综合查询各种销售明细记录、各地收银员收银记录以及交结账情况等。 按多种方式统计生成销售排行榜,灵活察看和打印商品销售日、月、年报表。

 库存管理: 综合查询库存明细记录。 库存状态自动告警提示。如库存过剩、少货、缺货等。软件为您预警,避免库存商品积压损失和缺货。 库存自动盘点计算。

 人员管理: 员工、会员、供货商、厂商等基本信息登记管理。 员工 *** 作权限管理。 客户销售权限管理。

(3)系统结构

系统总体结构

模块子系统结构

功能描述:商品录入子系统要求能快速录入商品,因此必须支持条形码扫描。

功能描述:收银业务子系统能计算交易总额,打印交易清单,并根据会员卡打折。

功能描述:进货管理子系统可以根据库存自动指定进货计划,进货时自动等级,以及提供查询和打印计划进货与入库记录的功能。

功能描述:销售管理子系统可以控制某商品是否允许销售,查询每种商品的销售情况并产生年、月、日报表,同时可以生成销售排行榜。

功能描述:库存管理子系统提供查询库存明细记录的基本功能,并根据库存的状态报警,以及自动盘点计算。

功能描述:人员管理子系统提供基本信息登记管理,员工 *** 作权限管理,客户销售权限管理的功能。

2.2、流程图

前台管理系统

顶层DFD图

第0层DFD图

第1层DFD图

2.3、户类型与职能

(1)、员工(营业员):

 通过商品条形码扫描输入商品到购买清单

 *** 作软件计算交易总金额

 *** 作软件输出交易清单

 对会员进行会员卡扫描以便打折

(2)、:超市经理

 *** 作软件录入商品,供货商,厂商

 *** 作软件制定进货计划

 查询打印计划进货与入库记录

 *** 作软件控制商品销售与否

 查询打印销售情况

 *** 作软件生成销售排行榜

 查询库存明细记录

 根据软件发出的库存告警进行入货

 *** 作软件进行盘点计算

(3)、总经理:

 基本信息登记管理

 员工 *** 作权限管理

 客户销售权限管理

2.4、统开发步骤

 确定参与者和相关的用况

 为每个用况设计过程

 建立顺序图,确定每个脚本中对象的协作

 创建类,确定脚本中的对象

 设计, 编码, 测试, 集成类

 为过程编写系统测试案例

 运行测试案例,检验系统

2.5、系统环境需求

 系统模式

本系统采用C/S模式作为开发模式

 硬件环境

服务器端:

高性能的计算机一台,

普通的双绞线作为连接。

客户端: 普通的计算机或者工作站,

普通的双绞线作为连接。

 软件环境

服务器端:安装SQL Server 2000的服务器版本,

安装windows 2000服务器版本,

配置了诺顿等必须的防毒软件。

客户端: 安装SQL Server2000的服务器版本,

安装了VB等可视化开发工具软件,

安装windows2000服务器版本。

2.6、系统安全问题

信息系统尽管功能强大,技术先进,但由于受到自身体系结构,设计思路以及运行机制等限制,也隐含许多不安全因素。常见因素有:数据的输入,输出,存取与备份,源程序以及应用软件,数据库, *** 作系统等漏洞或缺陷,硬件,通信部分的漏洞,企业内部人员的因素,病毒,“黑客”等因素。因此,为使本系统能够真正安全,可靠,稳定地工作,必须考虑如下问题:为保证安全,不致使系统遭到意外事故的损害,系统因该能防止火,盗或其他形式的人为破坏。

 系统要能重建

 系统应该是可审查的

 系统应能进行有效控制,抗干扰能力强

 系统使用者的使用权限是可识别的

3、基于UML的建模

3.1语义规则

用例模型(use cases view)(用例视图)的基本组成部件是用例(use case)、角色(actor)和系统(system)。用例用于描述系统的功能,也就是从外部用户的角度观察,系统应支持哪些功能,帮助分析人员理解系统的行为,它是对系统功能的宏观描述,一个完整的系统中通常包含若干个用例,每个用例具体说明应完成的功能,代表系统的所有基本功能(集)。角色是与系统进行交互的外部实体,它可以是系统用户,也可以是其它系统或硬件设备,总之,凡是需要与系统交互的任何东西都可以称作角色。系统的边界线以内的区域(即用例的活动区域)则抽象表示系统能够实现的所有基本功能。在一个基本功能(集)已经实现的系统中,系统运转的大致过程是:外部角色先初始化用例,然后用例执行其所代表的功能,执行完后用例便给角色返回一些值,这个值可以是角色需要的来自系统中的任何东西。

UML:是一种标准的图形化建模语言,它是面向对象分析与设计的一种标准表示;它不是一种可视化的程序设计语言而是一种可视化的建模语言;不是工具或知识库的规格说明而是一种建模语言规格说明是一种表示的标准;不是过程也不是方法但允许任何一种过程和方法使用它。

用例(use case):

参与者(actor):

3.2、UML模型

3.21、系统UML模型

3.22、子系统UML模型

(1)零售前台(POS)管理系统用例视图

(2)后台管理系统用例视图

3.3、系统实现图

4、超市销售系统概念设计文档

(1)、系统ER图

(2)、系统ER图说明

1) 商店中的所有用户(员工)可以销售多种商品,每种商品可由不同用户(员工)销售;

2) 每个顾客可以购买多种商品,不同商品可由不同顾客购买;

3) 每个供货商可以供应多种不同商品,每种商品可由多个供应商供应。

(3)、视图设计

1) 交易视图(v_Dealing)——用于查询交易情况的视图;

2) 计划进货视图(v_PlanStock)——用于查询进货计划的视图;

3) 销售视图(v_Sale)——用于查询销售明细记录的视图;

4) 入库视图(v_Stock)——用于查询入库情况的视图。

5、逻辑设计文档

(1)、系统关系模型

a) 商品信息表(商品编号,商品名称,价格,条形码,促销价格,促销起日期,促销止日期,允许打折,库存数量,库存报警数量,计划进货数,允许销售,厂商编号,供货商编号)

b) 用户表(用户编号,用户名称,用户密码,用户类型)

c) 会员表(会员编号,会员卡号,累积消费金额,注册日期)

d) 销售表(销售编号,商品编号,销售数量,销售金额,销售日期)

e) 交易表(交易编号,用户名称,交易金额,会员卡号,交易日期)

f) 进货入库表(入库编号,入库商品编号,入库数量,单额,总额,入库日期,计划进货日期,入库状态)

g) 供货商表(供货商编号,供货商名称,供货商地址,供货商电话)

h) 厂商表(厂商编号,厂商名称,厂商地址,厂商电话)

(2)、系统数据库表结构

数据库表索引

表名 中文名

MerchInfo 商品信息表

User 用户表

Menber 会员表

Sale 销售表

Dealing 交易表

Stock 进货入库表

Provide 供货商表

Factory 厂商表

商品信息表(MerchInfo)

字段字段类型 长度 主/外键 字段值约束 对应中文名

MerchID int 4 P Not null 商品编号

MerchName Varchar 50 Not null 商品名称

MerchPrice Money 4 Not null 价格

MerchNum Int 4 Not null 库存数量

CautionNum Int 4 Not null 库存报警数量

PlanNum Int 4 null 计划进货数

BarCode Varchar 50 Not null 条形码

SalesProPrice Money 4 促销价格

SalesProDateS Datetime 8 促销起日期

SalesProDateE Datetime 8 促销止日期

AllowAbate Int 4 Not null 允许打折

AllowSale Int 4 Not null 允许销售

FactoryID Varchar 10 F Not null 厂商编号

ProvideID Varchar 10 F Not null 供货商编号

用户表(User)

字段名 字段类型 长度 主/外键 字段值约束 对应中文名

UserID varchar 10 P Not null 用户编号

UserName Varchar 25 Not null 用户名称

UserPW Varchar 50 Not null 用户密码

UserStyle Int 4 Not null 用户类型

会员表(Menber)

字段名 字段类型 长度 主/外键 字段值约束 对应中文名

MemberID Varchar 10 P Not null 会员编号

MemberCard Varchar 20 Not null 会员卡号

TotalCost Money 4 Not null 累积消费金额

RegDate Datetime 8 Not null 注册日期

销售表(Sale)

字段名 字段类型 长度 主/外键 字段值约束 对应中文名

SaleID Varchar 10 P Not null 销售编号

MerChID Varchar 10 F Not null 商品编号

SaleDate Datetime 8 Not null 销售日期

SaleNum Int 4 Not null 销售数量

SalePrice Money 4 Not null 销售单额

交易表(Dealing)

字段名 字段类型 长度 主/外键 字段值约束 对应中文名

DealingID Varchar 10 P Not null 交易编号

DealingPrice Money 4 Not null 交易金额

DealingDate Money 4 Not null 交易日期

MemberID Varchar 10 会员卡号

UserName Varchar 10 F Not null 用户名称

入库纪录表(Stock)

字段名 字段类型 长度 主/外键 字段值约束 对应中文名

StockID Varchar 10 P Not null 入库编号

MerchID Varchar 10 F Not null 入库商品编号

MerchNum Int 4 Not null 入库数量

MerchPrice Money 4 Not null 单额

TotalPrice Money 4 Not null 总额

StockDate Datetime 8 Datetime 入库日期

PlanDate Datetime 8 Datetime 计划进货日期

StockState Int 4 Not null 入库状态

供货商表(Provide)

字段名 字段类型 长度 主/外键 字段值约束 对应中文名

ProvideID varchar 10 P Not null 供货商编号

ProvideName Varchar 50 Not null 供货商名称

ProvideAddress Varchar 250 供货商地址

ProvidePhone Varchar 25 供货商电话

厂商表(Provide)

字段名 字段类型 长度 主/外键 字段值约束 对应中文名

FactoryID varchar 10 P Not null 厂商编号

FactoryName Varchar 50 Not null 厂商名称

FactoryAddress Varchar 250 厂商地址

FactoryPhone Varchar 25 厂商电话

6、物理设计文档

/*----------创建数据库----------*/

create database SuperMarketdb

on primary

(

name=SuperMarketdb,

filename='C:\Program Files\Microsoft SQL Server\MSSQL\Data\SuperMarketdb.mdf',

size=100MB,

maxsize=200MB,

filegrowth=20MB

)

log on

(

name=SuperMarketlog,

filename='C:\Program Files\Microsoft SQL Server\MSSQL\Data\SuperMarketdb.ldf',

size=60MB,

maxsize=200MB,

filegrowth=20MB

)

go

/*----------创建基本表----------*/

use [SuperMarketdb]

go

/*创建交易表*/

CREATE TABLE Dealing (

DealingID int identity(1,1) Primary key ,

DealingDate datetime NOT NULL ,

DealingPrice money NOT NULL ,

UserName varchar(25) NULL ,

MemberCard varchar(20) NULL

)

GO

/*创建厂商表*/

CREATE TABLE Factory (

FactoryID varchar(10) Primary key ,

FactoryName varchar(50) NOT NULL ,

FactoryAddress varchar(250) NULL ,

FactoryPhone varchar(50) NULL

)

GO

/*创建会员表*/

CREATE TABLE Member (

MemberID varchar(10) Primary key ,

MemberCard varchar(20) NOT NULL ,

TotalCost money NOT NULL ,

RegDate datetime NOT NULL

)

GO

/*创建商品信息表*/

CREATE TABLE MerchInfo (

MerchID int identity(1,1) Primary key ,

MerchName varchar(50) Unique NOT NULL ,

MerchPrice money NOT NULL ,

MerchNum int NOT NULL ,

CautionNum int NOT NULL ,

PlanNum int NOT NULL ,

BarCode varchar(20) Unique NOT NULL ,

SalesProPrice money NULL ,

SalesProDateS datetime NULL ,

SalesProDateE datetime NULL ,

AllowAbate int NOT NULL ,

AllowSale int NOT NULL ,

FactoryID int NOT NULL ,

ProvideID int NOT NULL

)

GO

/*创建供应商表*/

CREATE TABLE Provide (

ProvideID varchar(10) Primary key ,

ProvideName varchar(50) NOT NULL ,

ProvideAddress varchar(250) NULL ,

ProvidePhone varchar(25) NULL

)

GO

/*创建销售表*/

CREATE TABLE Sale (

SaleID int identity(1,1) Primary key ,

MerChID int NOT NULL ,

SaleDate datetime NOT NULL ,

SaleNum int NOT NULL,

SalePrice money NOT NULL

)

GO

/*创建入库表*/

CREATE TABLE Stock (

StockID int identity(1,1) Primary key ,

MerchID int NOT NULL ,

MerchNum int NOT NULL ,

MerchPrice money NULL ,

TotalPrice money NULL ,

PlanDate datetime NULL ,

StockDate datetime NULL,

StockState int NOT NULL

)

GO

/*创建用户表*/

CREATE TABLE User (

UserID varchar(10) Primary key ,

UserName varchar(25) NOT NULL ,

UserPW varchar(50) NOT NULL ,

UserStyle int NOT NULL ,

)

GO

/*----------创建表间约束----------*/

/*商品信息表中厂商编号、供应商编号分别与厂商表、供应商表之间的外键约束*/

ALTER TABLE MerchInfo ADD

CONSTRAINT [FK_MerchInfo_Factory] FOREIGN KEY

(

[FactoryID]

) REFERENCES Factory (

[FactoryID]

),

CONSTRAINT [FK_MerchInfo_Provide] FOREIGN KEY

(

[ProvideID]

) REFERENCES Provide (

[ProvideID]

)

GO

/*销售表中商品编号与商品信息表之间的外键约束*/

ALTER TABLE Sale ADD

CONSTRAINT [FK_Sale_MerchInfo] FOREIGN KEY

(

[MerChID]

) REFERENCES MerchInfo (

[MerchID]

) ON DELETE CASCADE

GO

/*入库表中商品编号与商品信息表之间的外键约束*/

ALTER TABLE Stock ADD

CONSTRAINT [FK_Stock_MerchInfo] FOREIGN KEY

(

[MerchID]

) REFERENCES MerchInfo (

[MerchID]

) ON DELETE CASCADE

GO

/*----------创建索引----------*/

/*在交易表上建立一个以交易编号、交易日期为索引项的非聚集索引*/

CREATE nonclustered INDEX IX_Dealing ON Dealing(DealingID, DealingDate)

GO

/*在商品信息表上建立一个以商品编号为索引项的非聚集索引*/

CREATE nonclustered INDEX IX_MerchInfo ON MerchInfo(MerchID)

GO

/*在销售表上建立一个以销售编号、销售日期为索引项的非聚集索引*/

CREATE nonclustered INDEX IX_Sale ON Sale(SaleID, SaleDate)

GO

/*在入库表上建立一个以入库编号、入库日期、商品编号为索引项的非聚集索引*/

CREATE nonclustered INDEX IX_Stock ON Stock(StockID, StockDate, MerchID)

GO

/*----------创建视图----------*/

/*创建用于查询交易情况的视图*/

CREATE VIEW v_Dealing

AS

SELECT DealingDate as 交易日期,

UserName as 员工名称,

MemberCard as 会员卡号,

DealingPrice as 交易金额

FROM Dealing

GO

/*创建用于查询进货计划的视图*/

CREATE VIEW v_PlanStock

AS

SELECT Stock.StockID as SID,

MerchInfo.MerchName as 商品名称,

MerchInfo.BarCode as 条形码,

Factory.FactoryName as 厂商,

Provide.ProvideName as 供货商,

Stock.MerchNum as 计划进货数量,

Stock.PlanDate as 计划进货日期

FROM Stock,MerchInfo,Provide,Factory

Where Stock.MerchID = MerchInfo.MerchID

and Provide.ProvideID=MerchInfo.ProvideID

and Factory.FactoryID=MerchInfo.FactoryID

and Stock.StockState=0

GO

/*创建用于查询销售明细记录的视图*/

CREATE VIEW v_Sale

AS

SELECT MerchInfo.MerchName as 商品名称,

MerchInfo.BarCode as 条形码,

MerchInfo.MerchPrice as 商品价格,

Sale.SalePrice as 销售价格,

Sale.SaleNum as 销售数量,

Sale.SaleDate as 销售日期

FROM Sale INNER JOIN

MerchInfo ON Sale.MerChID = MerchInfo.MerchID

GO

/*创建用于查询入库情况的视图*/

CREATE VIEW v_Stock

AS

SELECT MerchInfo.MerchName as 商品名称,

MerchInfo.BarCode as 条形码,

Factory.FactoryName as 厂商,

Provide.ProvideName as 供货商,

Stock.MerchPrice as 入库价格,

Stock.MerchNum as 入库数量,

Stock.TotalPrice as 入库总额,

Stock.StockDate as 入库日期

FROM Stock,MerchInfo,Provide,Factory

Where Stock.MerchID = MerchInfo.MerchID

and Provide.ProvideID=MerchInfo.ProvideID

and Factory.FactoryID=MerchInfo.FactoryID

and Stock.StockState=1

GO

7、小结

和传统管理模式相比较,使用本系统,毫无疑问会大大提高超市的运作效率,辅助提高超市的决策水平,管理水平,为降低经营成本, 提高效益,减少差错,节省人力,减少顾客购物时间,增加客流量,提高顾客满意度,增强超市扩张能力, 提供有效的技术保障。

由于开发者能力有限,加上时间仓促,本系统难免会出现一些不足之处,例如:

 本系统只适合小型超市使用,不能适合中大型超市使用;

 超市管理系统涉及范围宽,要解决的问题多,功能复杂,实现困难,但由于限于时间,本系统只能做出其中的一部分功能;

对于以上出现的问题,我们深表歉意,如发现还有其它问题,希望老师批评指正。

一、数据库设计过程

数据库技术是信息资源管理最有效的手段。

数据库设计是指:对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其应用系统,有效存储数据,满足用户信息要求和处理要求。

数据库设计的各阶段:

A、需求分析阶段:综合各个用户的应用需求(现实世界的需求)。

B、在概念设计阶段:形成独立于机器和各DBMS产品的概念模式(信息世界模型),用E-R图来描述。

C、在逻辑设计阶段:将E-R图转换成具体的数据库产品支持的数据模型,如关系模型,形成数据库逻辑模式。然后根据用户处理的要求,安全性的考虑,在基本表的基础上再建立必要的视图(VIEW)形成数据的外模式。

D、在物理设计阶段:根据DBMS特点和处理的需要,进行物理存储安排,设计索引,形成数据库内模式。

1. 需求分析阶段

需求收集和分析,结果得到数据字典描述的数据需求(和数据流图描述的处理需求)。

需求分析的重点:调查、收集与分析用户在数据管理中的信息要求、处理要求、安全性与完整性要求。

需求分析的方法:调查组织机构情况、各部门的业务活动情况、协助用户明确对新系统的各种要求、确定新系统的边界。

常用的调查方法有: 跟班作业、开调查会、请专人介绍、询问、设计调查表请用户填写、查阅记录。

分析和表达用户需求的方法主要包括自顶向下和自底向上两类方法。自顶向下的结构化分析方法(Structured Analysis,简称SA方法)从最上层的系统组织机构入手,采用逐层分解的方式分析系统,并把每一层用数据流图和数据字典描述。

数据流图表达了数据和处理过程的关系。系统中的数据则借助数据字典(Data Dictionary,简称DD)来描述。

2. 概念结构设计阶段

通过对用户需求进行综合、归纳与抽象,形成一个独立于具体DBMS的概念模型,可以用E-R图表示。

概念模型用于信息世界的建模。概念模型不依赖于某一个DBMS支持的数据模型。概念模型可以转换为计算机上某一DBMS支持的特定数据模型。

概念模型特点:

(1) 具有较强的语义表达能力,能够方便、直接地表达应用中的各种语义知识。

(2) 应该简单、清晰、易于用户理解,是用户与数据库设计人员之间进行交流的语言。

概念模型设计的一种常用方法为IDEF1X方法,它就是把实体-联系方法应用到语义数据模型中的一种语义模型化技术,用于建立系统信息模型。

作者: 小灵, 出处:论坛, 责任编辑: 李书琴, 2007-09-27 15:17

本文详细解析了数据库设计过程、设计技巧以及总结了数据库命名规范……

2.1 第零步——初始化工程

这个阶段的任务是从目的描述和范围描述开始,确定建模目标,开发建模计划,组织建模队伍,收集源材料,制定约束和规范。收集源材料是这阶段的重点。通过调查和观察结果,业务流程,原有系统的输入输出,各种报表,收集原始数据,形成了基本数据资料表。

2.2 第一步——定义实体

实体集成员都有一个共同的特征和属性集,可以从收集的源材料——基本数据资料表中直接或间接标识出大部分实体。根据源材料名字表中表示物的术语以及具有 “代码”结尾的术语,如客户代码、代理商代码、产品代码等将其名词部分代表的实体标识出来,从而初步找出潜在的实体,形成初步实体表。

2.3 第二步——定义联系

IDEF1X模型中只允许二元联系,n元联系必须定义为n个二元联系。根据实际的业务需求和规则,使用实体联系矩阵来标识实体间的二元关系,然后根据实际情况确定出连接关系的势、关系名和说明,确定关系类型,是标识关系、非标识关系(强制的或可选的)还是非确定关系、分类关系。如果子实体的每个实例都需要通过和父实体的关系来标识,则为标识关系,否则为非标识关系。非标识关系中,如果每个子实体的实例都与而且只与一个父实体关联,则为强制的,否则为非强制的。如果父实体与子实体代表的是同一现实对象,那么它们为分类关系。

2.4 第三步——定义码

通过引入交叉实体除去上一阶段产生的非确定关系,然后从非交叉实体和独立实体开始标识侯选码属性,以便唯一识别每个实体的实例,再从侯选码中确定主码。为了确定主码和关系的有效性,通过非空规则和非多值规则来保证,即一个实体实例的一个属性不能是空值,也不能在同一个时刻有一个以上的值。找出误认的确定关系,将实体进一步分解,最后构造出IDEF1X模型的键基视图(KB图)。

2.5 第四步——定义属性

从源数据表中抽取说明性的名词开发出属性表,确定属性的所有者。定义非主码属性,检查属性的非空及非多值规则。此外,还要检查完全依赖函数规则和非传递依赖规则,保证一个非主码属性必须依赖于主码、整个主码、仅仅是主码。以此得到了至少符合关系理论第三范式的改进的IDEF1X模型的全属性视图。

2.6 第五步——定义其他对象和规则

定义属性的数据类型、长度、精度、非空、缺省值、约束规则等。定义触发器、存储过程、视图、角色、同义词、序列等对象信息。

3. 逻辑结构设计阶段

将概念结构转换为某个DBMS所支持的数据模型(例如关系模型),并对其进行优化。设计逻辑结构应该选择最适于描述与表达相应概念结构的数据模型,然后选择最合适的DBMS。

将E-R图转换为关系模型实际上就是要将实体、实体的属性和实体之间的联系转化为关系模式,这种转换一般遵循如下原则:一个实体型转换为一个关系模式。实体的属性就是关系的属性。实体的码就是关系的码。

数据模型的优化,确定数据依赖,消除冗余的联系,确定各关系模式分别属于第几范式。确定是否要对它们进行合并或分解。一般来说将关系分解为3NF的标准,即:

表内的每一个值都只能被表达一次。

表内的每一行都应该被唯一的标识(有唯一键)。

表内不应该存储依赖于其他键的非键信息。

作者: 小灵, 出处:论坛, 责任编辑: 李书琴, 2007-09-27 15:17

本文详细解析了数据库设计过程、设计技巧以及总结了数据库命名规范……

4. 数据库物理设计阶段

为逻辑数据模型选取一个最适合应用环境的物理结构(包括存储结构和存取方法)。根据DBMS特点和处理的需要,进行物理存储安排,设计索引,形成数据库内模式。

5. 数据库实施阶段

运用DBMS提供的数据语言(例如SQL)及其宿主语言(例如C),根据逻辑设计和物理设计的结果建立数据库,编制与调试应用程序,组织数据入库,并进行试运行。 数据库实施主要包括以下工作:用DDL定义数据库结构、组织数据入库 、编制与调试应用程序、数据库试运行 ,(Data Definition Language(DDL数据定义语言)用作开新数据表、设定字段、删除数据表、删除字段,管理所有有关数据库结构的东西)

●Create (新增有关数据库结构的东西,属DDL)

●Drop (删除有关数据库结构的东西,属DDL)

●Alter (更改结构,属DDL)

6. 数据库运行和维护阶段

在数据库系统运行过程中必须不断地对其进行评价、调整与修改。内容包括:数据库的转储和恢复、数据库的安全性、完整性控制、数据库性能的监督、分析和改进、数据库的重组织和重构造。

7. 建模工具的使用

为加快数据库设计速度,目前有很多数据库辅助工具(CASE工具),如Rational公司的Rational Rose,CA公司的Erwin和Bpwin,Sybase公司的PowerDesigner以及Oracle公司的oracle Designer等。

ERwin主要用来建立数据库的概念模型和物理模型。它能用图形化的方式,描述出实体、联系及实体的属性。ERwin支持IDEF1X方法。通过使用 ERwin建模工具自动生成、更改和分析IDEF1X模型,不仅能得到优秀的业务功能和数据需求模型,而且可以实现从IDEF1X模型到数据库物理设计的转变。ERwin工具绘制的模型对应于逻辑模型和物理模型两种。在逻辑模型中,IDEF1X工具箱可以方便地用图形化的方式构建和绘制实体联系及实体的属性。在物理模型中,ERwin可以定义对应的表、列,并可针对各种数据库管理系统自动转换为适当的类型。

设计人员可根据需要选用相应的数据库设计建模工具。例如需求分析完成之后,设计人员可以使用Erwin画ER图,将ER图转换为关系数据模型,生成数据库结构画数据流图,生成应用程序。

二、数据库设计技巧

1. 设计数据库之前(需求分析阶段)

1) 理解客户需求,包括用户未来需求变化。

2) 了解企业业务类型,可以在开发阶段节约大量的时间。

3) 重视输入(要记录的数据)、输出(报表、查询、视图)。

4) 创建数据字典和ER 图表

数据字典(Data Dictionary,简称DD)是各类数据描述的集合,是关于数据库中数据的描述,即元数据,不是数据本身。(至少应该包含每个字段的数据类型和在每个表内的主外键)。

数据项描述: 数据项名,数据项含义说明,别名,数据类型,长度,取值范围,取值含义,与其他数据项的逻辑关系

数据结构描述: 数据结构名,含义说明,组成:[数据项或数据结构]

数据流描述: 数据流名,说明,数据流来源,数据流去向, 组成:[数据结构],平均流量,高峰期流量

数据存储描述: 数据存储名,说明,编号,流入的数据流,流出的数据流,组成:[数据结构],数据量,存取方式

处理过程描述: 处理过程名,说明,输入:[数据流],输出:[数据流],处理:[简要说明]

ER 图表和数据字典可以让任何了解数据库的人都明确如何从数据库中获得数据。ER图对表明表之间关系很有用,而数据字典则说明了每个字段的用途以及任何可能存在的别名。对SQL 表达式的文档化来说这是完全必要的。

5) 定义标准的对象命名规范

数据库各种对象的命名必须规范。

作者: 小灵, 出处:论坛, 责任编辑: 李书琴, 2007-09-27 15:17

本文详细解析了数据库设计过程、设计技巧以及总结了数据库命名规范……

2. 表和字段的设计(数据库逻辑设计)

表设计原则

1) 标准化和规范化

数据的标准化有助于消除数据库中的数据冗余。标准化有好几种形式,但Third Normal Form(3NF)通常被认为在性能、扩展性和数据完整性方面达到了最好平衡。简单来说,遵守3NF 标准的数据库的表设计原则是:“One Fact in One Place”即某个表只包括其本身基本的属性,当不是它们本身所具有的属性时需进行分解。表之间的关系通过外键相连接。它具有以下特点:有一组表专门存放通过键连接起来的关联数据。

2) 数据驱动

采用数据驱动而非硬编码的方式,许多策略变更和维护都会方便得多,大大增强系统的灵活性和扩展性。

举例,假如用户界面要访问外部数据源(文件、XML 文档、其他数据库等),不妨把相应的连接和路径信息存储在用户界面支持的表里。如果用户界面执行工作流之类的任务(发送邮件、打印信笺、修改记录状态等),那么产生工作流的数据也可以存放在数据库里。角色权限管理也可以通过数据驱动来完成。事实上,如果过程是数据驱动的,你就可以把相当大的责任推给用户,由用户来维护自己的工作流过程。

3) 考虑各种变化

在设计数据库的时候考虑到哪些数据字段将来可能会发生变更。

4) 表名、报表名和查询名的命名规范

(采用前缀命名)检查表名、报表名和查询名之间的命名规范。你可能会很快就被这些不同的数据库要素的名称搞糊涂了。你可以统一地命名这些数据库的不同组成部分,至少你应该在这些对象名字的开头用 Table、Query 或者 Report 等前缀加以区别。如果采用了 Microsoft Access,你可以用 qry、rpt、tbl 和 mod 等符号来标识对象(比如 tbl_Employees)。用 sp_company 标识存储过程,用 udf_ (或者类似的标记)标识自定义编写的函数。

字段设计原则:

1) 每个表中都应该添加的3 个有用的字段。

dRecordCreationDate,在SQL Server 下默认为GETDATE()

sRecordCreator,在SQL Server 下默认为NOT NULL DEFAULT USER

nRecordVersion,记录的版本标记有助于准确说明记录中出现null 数据或者丢失数据的原因

时效性数据应包括“最近更新日期/时间”字段。时间标记对查找数据问题的原因、按日期重新处理/重载数据和清除旧数据特别有用。

2) 对地址和电话采用多个字段

描述街道地址就短短一行记录是不够的。Address_Line1、Address_Line2 和Address_Line3 可以提供更大的灵活性。还有,电话号码和邮件地址最好拥有自己的数据表,其间具有自身的类型和标记类别。

3) 表内的列[字段]的命名规则(采用前缀/后缀命名)、采用有意义的字段名

对列[字段]名应该采用标准的前缀和后缀。如键是数字类型:用 _N 后缀字符类型:_C 后缀日期类型:_D 后缀。再如,假如你的表里有好多“money”字段,你不妨给每个列[字段]增加一个 _M 后缀。

作者: 小灵, 出处:论坛, 责任编辑: 李书琴, 2007-09-27 15:17

本文详细解析了数据库设计过程、设计技巧以及总结了数据库命名规范……

假设有两个表:

Customer 和 Order。Customer 表的前缀是 cu_,所以该表内的子段名如下:cu_name_id、cu_surname、cu_initials 和cu_address 等。Order 表的前缀是 or_,所以子段名是:

or_order_id、or_cust_name_id、or_quantity 和 or_description 等。

这样从数据库中选出全部数据的 SQL 语句可以写成如下所示:

Select * From Customer, Order Where cu_surname = "MYNAME"

and cu_name_id = or_cust_name_id and or_quantity = 1

在没有这些前缀的情况下则写成这个样子(用别名来区分):

Select * From Customer, Order Where Customer.surname = "MYNAME"

and Customer.name_id = Order.cust_name_id and Order.quantity = 1

第 1 个 SQL 语句没少键入多少字符。但如果查询涉及到 5 个表乃至更多的列[字段]你就知道这个技巧多有用了。

5) 选择数字类型和文本类型的长度应尽量充足

假设客户ID 为10 位数长。那你应该把数据库表字段的长度设为12 或者13 个字符长。但这额外占据的空间却无需将来重构整个数据库就可以实现数据库规模的增长了。

6) 增加删除标记字段

在表中包含一个“删除标记”字段,这样就可以把行标记为删除。在关系数据库里不要单独删除某一行最好采用清除数据程序而且要仔细维护索引整体性。

7) 提防大小写混用的对象名和特殊字符

采用全部大写而且包含下划符的名字具有更好的可读性(CUSTOMER_DATA),绝对不要在对象名的字符之间留空格。

8) 小心保留词

要保证你的字段名没有和保留词、数据库系统或者常用访问方法冲突,比如,用 DESC 作为说明字段名。后果可想而知!DESC 是 DESCENDING 缩写后的保留词。表里的一个 SELECT * 语句倒是能用,但得到的却是一大堆毫无用处的信息。

9) 保持字段名和类型的一致性

在命名字段并为其指定数据类型的时候一定要保证一致性。假如字段在表1中叫做“agreement_number”,就别在表2里把名字改成 “ref1”。假如数据类型在表1里是整数,那在表2里可就别变成字符型了。当然在表1(ABC)有处键ID,则为了可读性,在表2做关联时可以命名为 ABC_ID。

10) 避免使用触发器

触发器的功能通常可以用其他方式实现。在调试程序时触发器可能成为干扰。假如你确实需要采用触发器,你最好集中对它文档化。

作者: 小灵, 出处:论坛, 责任编辑: 李书琴, 2007-09-27 15:17

本文详细解析了数据库设计过程、设计技巧以及总结了数据库命名规范……

3. 选择键和索引(数据库逻辑设计)

参考:《SQL优化-索引》一文

4. 数据完整性设计(数据库逻辑设计)

1) 完整性实现机制:

实体完整性:主键

参照完整性:

父表中删除数据:级联删除受限删除置空值

父表中插入数据:受限插入递归插入

父表中更新数据:级联更新受限更新置空值

DBMS对参照完整性可以有两种方法实现:外键实现机制(约束规则)和触发器实现机制用户定义完整性:

NOT NULLCHECK触发器

2) 用约束而非商务规则强制数据完整性

采用数据库系统实现数据的完整性。这不但包括通过标准化实现的完整性而且还包括数据的功能性。不要依赖于商务层保证数据完整性它不能保证表之间(外键) 的完整性所以不能强加于其他完整性规则之上。如果你在数据层确实采用了约束,你要保证有办法把更新不能通过约束检查的原因采用用户理解的语言通知用户界面。

3) 强制指示完整性

在有害数据进入数据库之前将其剔除。激活数据库系统的指示完整性特性。这样可以保持数据的清洁而能迫使开发人员投入更多的时间处理错误条件。

4) 使用查找控制数据完整性

控制数据完整性的最佳方式就是限制用户的选择。只要有可能都应该提供给用户一个清晰的价值列表供其选择。这样将减少键入代码的错误和误解同时提供数据的一致性。某些公共数据特别适合查找:国家代码、状态代码等。

5) 采用视图

为了在数据库和应用程序代码之间提供另一层抽象,可以为应用程序建立专门的视图而不必非要应用程序直接访问数据表。这样做还等于在处理数据库变更时给你提供了更多的自由。

6) 分布式数据系统

对分布式系统而言,在你决定是否在各个站点复制所有数据还是把数据保存在一个地方之前应该估计一下未来 5 年或者 10 年的数据量。当你把数据传送到其他站点的时候,最好在数据库字段中设置一些标记,在目的站点收到你的数据之后更新你的标记。为了进行这种数据传输,请写下你自己的批处理或者调度程序以特定时间间隔运行而不要让用户在每天的工作后传输数据。本地拷贝你的维护数据,比如计算常数和利息率等,设置版本号保证数据在每个站点都完全一致。

7) 关系

如果两个实体之间存在多对一关系,而且还有可能转化为多对多关系,那么你最好一开始就设置成多对多关系。从现有的多对一关系转变为多对多关系比一开始就是多对多关系要难得多。

8) 给数据保有和恢复制定计划

考虑数据保存策略并包含在设计过程中,预先设计你的数据恢复过程。采用可以发布给用户/开发人员的数据字典实现方便的数据识别同时保证对数据源文档化。编写在线更新来“更新查询”供以后万一数据丢失可以重新处理更新。

9) 用存储过程让系统做重活

提供一整套常规的存储过程来访问各组以便加快速度和简化客户程序代码的开发。数据库不只是一个存放数据的地方,它也是简化编码之地。

本文详细解析了数据库设计过程、设计技巧以及总结了数据库命名规范……

5. 其他设计技巧

1) 避免使用触发器

触发器的功能通常可以用其他方式实现。在调试程序时触发器可能成为干扰。假如你确实需要采用触发器,你最好集中对它文档化。

2) 使用常用英语(或者其他任何语言)而不要使用编码

在创建下拉菜单、列表、报表时最好按照英语名排序。假如需要编码,可以在编码旁附上用户知道的英语。

3) 保存常用信息

让一个表专门存放一般数据库信息非常有用。在这个表里存放数据库当前版本、最近检查/修复(对Access)、关联设计文档的名称、客户等信息。这样可以实现一种简单机制跟踪数据库,当客户抱怨他们的数据库没有达到希望的要求而与你联系时,这样做对非客户机/服务器环境特别有用。

4) 包含版本机制

在数据库中引入版本控制机制来确定使用中的数据库的版本。时间一长,用户的需求总是会改变的。最终可能会要求修改数据库结构。把版本信息直接存放到数据库中更为方便。

5) 编制文档

对所有的快捷方式、命名规范、限制和函数都要编制文档。

采用给表、列、触发器等加注释的 数据库工具。对开发、支持和跟踪修改非常有用。

对数据库文档化,或者在数据库自身的内部或者单独建立文档。这样,当过了一年多时间后再回过头来做第2 个版本,犯错的机会将大大减少。

6) 测试、测试、反复测试

建立或者修订数据库之后,必须用用户新输入的数据测试数据字段。最重要的是,让用户进行测试并且同用户一道保证选择的数据类型满足商业要求。测试需要在把新数据库投入实际服务之前完成。

7) 检查设计

在开发期间检查数据库设计的常用技术是通过其所支持的应用程序原型检查数据库。换句话说,针对每一种最终表达数据的原型应用,保证你检查了数据模型并且查看如何取出数据。

三、数据库命名规范

1. 实体(表)的命名

1) 表以名词或名词短语命名,确定表名是采用复数还是单数形式,此外给表的别名定义简单规则(比方说,如果表名是一个单词,别名就取单词的前4 个字母如果表名是两个单词,就各取两个单词的前两个字母组成4 个字母长的别名如果表的名字由3 个单词组成,从头两个单词中各取一个然后从最后一个单词中再取出两个字母,结果还是组成4 字母长的别名,其余依次类推)

对工作用表来说,表名可以加上前缀WORK_ 后面附上采用该表的应用程序的名字。在命名过程当中,根据语义拼凑缩写即可。注意:将字段名称会统一成大写或者小写中的一种,故中间加上下划线。

作者: 小灵, 出处:论坛, 责任编辑: 李书琴, 2007-09-27 15:17

本文详细解析了数据库设计过程、设计技巧以及总结了数据库命名规范……

举例:

定义的缩写 Sales: Sal 销售

Order: Ord 订单

Detail: Dtl 明细

则销售订单明细表命名为:Sal_Ord_Dtl

2) 如果表或者是字段的名称仅有一个单词,那么建议不使用缩写,而是用完整的单词。

举例:

定义的缩写 Material Ma 物品

物品表名为:Material, 而不是 Ma.

但是字段物品编码则是:Ma_ID而不是Material_ID

3) 所有的存储值列表的表前面加上前缀Z

目的是将这些值列表类排序在数据库最后。

4) 所有的冗余类的命名(主要是累计表)前面加上前缀X

冗余类是为了提高数据库效率,非规范化数据库的时候加入的字段或者表

5) 关联类通过用下划线连接两个基本类之后,再加前缀R的方式命名,后面按照字母顺序罗列两个表名或者表名的缩写。

关联表用于保存多对多关系。

如果被关联的表名大于10个字母,必须将原来的表名的进行缩写。如果没有其他原因,建议都使用缩写。

举例:表Object与自身存在多对多的关系,则保存多对多关系的表命名为:R_Object

作者: 小灵, 出处:论坛, 责任编辑: 李书琴, 2007-09-27 15:17

本文详细解析了数据库设计过程、设计技巧以及总结了数据库命名规范……

2. 属性(列)的命名

1) 采用有意义的列名

表内的列要针对键采用一整套设计规则。每一个表都将有一个自动ID作为主健,逻辑上的主健作为第一组候选主健来定义

A、如果是数据库自动生成的编码,统一命名为:ID

B、如果是自定义的逻辑上的编码则用缩写加“ID”的方法命名,即“XXXX_ID”

C、如果键是数字类型,你可以用_NO 作为后缀

D、如果是字符类型则可以采用_CODE 后缀

E、对列名应该采用标准的前缀和后缀。

举例:销售订单的编号字段命名:Sal_Ord_ID如果还存在一个数据库生成的自动编号,则命名为:ID。

2) 所有的属性加上有关类型的后缀

注意,如果还需要其它的后缀,都放在类型后缀之前。

注: 数据类型是文本的字段,类型后缀TX可以不写。有些类型比较明显的字段,可以不写类型后缀。

3) 采用前缀命名

给每个表的列名都采用统一的前缀,那么在编写SQL表达式的时候会得到大大的简化。这样做也确实有缺点,比如破坏了自动表连接工具的作用,后者把公共列名同某些数据库联系起来。

3. 视图的命名

1) 视图以V作为前缀,其他命名规则和表的命名类似

2) 命名应尽量体现各视图的功能。

4. 触发器的命名(尽量不使用)

触发器以TR作为前缀,触发器名为相应的表名加上后缀,Insert触发器加'_I',Delete触发器加'_D',Update触发器加'_U',如:TR_Customer_I,TR_Customer_D,TR_Customer_U。

5. 存储过程名

存储过程应以'UP_'开头,和系统的存储过程区分,后续部分主要以动宾形式构成,并用下划线分割各个组成部分。如增加代理商的帐户的存储过程为'UP_Ins_Agent_Account'。

6. 变量名

变量名采用小写,若属于词组形式,用下划线分隔每个单词,如@my_err_no。

7. 命名中其他注意事项

1) 以上命名都不得超过30个字符的系统限制。变量名的长度限制为29(不包括标识字符@)。

2) 数据对象、变量的命名都采用英文字符,禁止使用中文命名。绝对不要在对象名的字符之间留空格。

3) 小心保留词,要保证你的字段名没有和保留词、数据库系统或者常用访问方法冲突

4) 保持字段名和类型的一致性,在命名字段并为其指定数据类型的时候一定要保证一致性。假如数据类型在一个表里是整数,那在另一个表里可就别变成字符型了。


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存