简述数据库应用系统的设计步骤(简述数据库系统构成及数据设计的原则)

简述数据库应用系统的设计步骤(简述数据库系统构成及数据设计的原则),第1张

数据库设计的基本步骤:

1、系统需求分析与设计。

2、概念结构分析与设计。

3、逻辑结构分析与设计。

4、物理结构分析与设计。

5、系统实施。

6、系统维护。

扩展资料:

数据库设计技巧:

1、原始文件与实体的关系

它可以是一对一,一对多,多对多的关系。一般来说,它们是一对一的关系:一个原始文档只对应于一个实体。在特殊情况下,它们可以是一对多或多对一关系,即一个原始文档对应于多个实体,或者多个原始文档对应于一个实体。

这里的实体可以理解为基本表。在对应关系明确后,对输入接口的设计非常有利。

2、主键和外键

一般来说,实体不能既没有主键也没有外键。在E-R图中,叶中的实体可以定义主键或不定义主键(因为它没有子代),但它必须有外键(因为它有父项)。

主键和外键的设计在全局数据库的设计中起着重要的作用。当全球数据库的设计完成后,一位美国数据库设计专家说:“钥匙无处不在,只有钥匙。”。这是他数据库设计的经验,也体现了他对信息系统核心(数据模型)高度抽象的理念。

因为:主键是一个高度抽象的实体。主键和外键的配对表示实体之间的连接。

3、基本表的属性

基本表不同于中间表和临时表,因为它具有以下四个特点:

原子性。基本表中的字段不可分解。

原始主义。基本表中的记录是原始数据(基本数据)的记录。

演绎的。所有输出数据都可以从基本表和代码表中的数据导出。

稳定。基本表的结构比较稳定,表中的记录要长期保存。

在了解基本表的性质之后,在设计数据库时,可以将基本表与中间表和临时表区分开来。

来源:百度百科-数据库设计

一、最根本也是第一步要做的就是,在设计系统架构阶段就需要充分地考虑系统的可扩展性、模块的高聚合性以及接口灵活易用的性。要做到这一点,就和对需求的分析、系统的了解和经验有很大关系了,需要长期的积累和经常对架构的思考与实践。交给团队里面最牛逼的一个人去主导,比较牛逼的几人参与讨论来做这一步吧。

二、选用一个适合需求的开发框架,会让你事倍功半。PHP的框架有很多,各自有各自的特性和优劣,可以比较选择。Python的tornado在做Web应用的时候比较方便。同样前段也需要代码框架的支持,Javascript中jQuery能胜任大多数项目,HTML和CSS可以尝试使用Twitter的Bootstrap。使用框架对代码的健壮性有帮助吗?当然有!因为框架封装实现很多常用的功能,这样我们自己的代码量会大大减少。直观一点讲,代码量少了,bug自然就少了。其实最重要的是代码量少了,程序的逻辑和结构会更加清晰,从而减少Bug的出现。

三、多人协作需要良好的代码管理工具。SVN可以考虑淘汰了,用分布式的GIT。

四、团队还需要统一的开发环境。包括统一的编码规范、统一的语言版本、统一的编辑器配置(tab和空格之类)、统一的文件编码,统一的数据库等等。这样可以完全避免因为环境不同而导致的Bug。

五、较优秀的程序员应该负责较初级的程序员的代码质量,定期对初级程序员的代码进行review。同时团队内部应该有针对性对一些比较复杂或者变态的部分进行code review。

六、对于系统的破窗和肿瘤,要适时适量地清除,绝对不能放任不管。

大致的讲主要是根据用户的需求,然后设计数据库的E-R模型,然后将E-R模型图转换为各种表,并对其进行数据库设计范式(范式因不同书籍有不同)的审核,然后进行数据库的实施,然后运行维护。

一句话来讲就是将用户的需求变成带有各种关系的表,以及其它的数据库结构,然后供编程使用

具体如下:

按照规范设计的方法,考虑数据库及其应用系统开发全过程,将数据库设计分为以下六个阶段

(1)需求分析。

(2)概念设计。

(3)逻辑设计。

(4)物理设计。

(5)数据库实施。

(6)数据库运行和维护。

5.1.1需求分析阶段

进行数据库设计首先必须准确了解与分析用户需求,包括数据与处理需求。需求分析是整个设计过程的基础,是最困难、最耗时的一步。作为“地基”的需求分析是否做得充分与准确,决定了在其上构建“数据库大厦”的速度与质量。需求分析做得不好,可能会导致整个数据库重新设计,因此,务必引起高度重视。

5.1.2概念模型设计阶段

在概念设计阶段,设计人员仅从用户角度看待数据及其处理要求和约束,产生一个反映用户观点的概念模式,也称为“组织模式”。概念模式能充分反映现实世界中实体间的联系,又是各种基本数据模型的共同基础,易于向关系模型转换。这样做有以下好处:

(1)数据库设计各阶段的任务相对单一化,设计复杂程度得到降低,便于组织管理。

(2)概念模式不受特定DBMS的限制,也独立于存储安排,因而比逻辑设计得到的模式更为稳定。

(3)概念模式不含具体的DBMS所附加的技术细节,更容易为用户所理解,因而能准确地反映用户的信息需求。

概念模型设计是整个数据库设计的关键,它通过对用户需求进行综合、归纳与抽象,形成一个独立于具体DBMS的概念模型。如采用基于E-R模型的数据库设计方法,该阶段即将所设计的对象抽象出E-R模型;如采用用户视图法,则应设计出不同的用户视图。

5.1.3逻辑模型设计阶段

逻辑模型设计阶段的任务是将概念模型设计阶段得到的基本E-R图,转换为与选用的DBMS产品所支持的数据模型相符合的逻辑结构。如采用基于E-R模型的数据库设计方法,该阶段就是将所设计的E-R模型转换为某个DBMS所支持的数据模型;如采用用户视图法,则应进行表的规范化,列出所有的关键字以及用数据结构图描述表集合中的约束与联系,汇总各用户视图的设计结果,将所有的用户视图合成一个复杂的数据库系统。

5.1.4数据库物理设计阶段

数据库的物理结构主要指数据库的存储记录格式、存储记录安排和存取方法。显然,数据库的物理设计完全依赖于给定的硬件环境和数据库产品。在关系模型系统中,物理设计比较简单一些,因为文件形式是单记录类型文件,仅包含索引机制、空间大小、块的大小等内容。

物理设计可分五步完成,前三步涉及到物理结构设计,后两步涉及到约束和具体的程序设计:

(1)存储记录结构设计:包括记录的组成、数据项的类型、长度,以及逻辑记录到存储记录的映射。

(2)确定数据存放位置:可以把经常同时被访问的数据组合在一起,“记录聚簇(cluster)”技术能满足这个要求。

(3)存取方法的设计:存取路径分为主存取路径及辅存取路径,前者用于主键检索,后者用于辅助键检索。

(4)完整性和安全性考虑:设计者应在完整性、安全性、有效性和效率方面进行分析,作出权衡。

(5)程序设计:在逻辑数据库结构确定后,应用程序设计就应当随之开始。物理数据独立性的目的是消除由于物理结构的改变而引起对应用程序的修改。当物理独立性未得到保证时,可能会引发对程序的修改。

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

5.1.5数据库实施阶段

根据逻辑设计和物理设计的结果,在计算机系统上建立起实际数据库结构、装入数据、测试和试运行的过程称为数据库的实施阶段。实施阶段主要有三项工作。

(1)建立实际数据库结构。对描述逻辑设计和物理设计结果的程序即“源模式”,经DBMS编译成目标模式并执行后,便建立了实际的数据库结构。

(2)装入试验数据对应用程序进行调试。试验数据可以是实际数据,也可由手工生成或用随机数发生器生成。应使测试数据尽可能覆盖现实世界的各种情况。

(3)装入实际数据,进入试运行状态。测量系统的性能指标,是否符合设计目标。如果不符,则返回到前面,修改数据库的物理模型设计甚至逻辑模型设计。

5.1.6数据库运行和维护阶段

数据库系统正式运行,标志着数据库设计与应用开发工作的结束和维护阶段的开始。运行维护阶段的主要任务有四项:

(1)维护数据库的安全性与完整性:检查系统安全性是否受到侵犯,及时调整授权和密码,实施系统转储与备份,发生故障后及时恢复。

(2)监测并改善数据库运行性能:对数据库的存储空间状况及响应时间进行分析评价,结合用户反应确定改进措施。

(3)根据用户要求对数据库现有功能进行扩充。

(4)及时改正运行中发现的系统错误。

随着计算机技术越来越广泛地应用于国民经济的各个领域 在计算机硬件不断微型化的同时 应用系统向着复杂化 大型化的方向发展 数据库是整个系统的核心 它的设计直接关系系统执行的效率和系统的稳定性 因此在软件系统开发中 数据库设计应遵循必要的数据库范式理论 以减少冗余 保证数据的完整性与正确性 只有在合适的数据库产品上设计出合理的数据库模型 才能降低整个系统的编程和维护难度 提高系统的实际运行效率 虽然对于小项目或中等规模的项目开发人员可以很容易地利用范式理论设计出一套符合要求的数据库 但对于一个包含大型数据库的软件项目 就必须有一套完整的设计原则与技巧

一 成立数据小组

大型数据库数据元素多 在设计上有必要成立专门的数据小组 由于数据库设计者不一定是使用者 对系统设计中的数据元素不可能考虑周全 数据库设计出来后 往往难以找到所需的库表 因此数据小组最好由熟悉业务的项目骨干组成

数据小组的职能并非是设计数据库 而是通过需求分析 在参考其他相似系统的基础上 提取系统的基本数据元素 担负对数据库的审核 审核内容包括审核新的数据库元素是否完全 能否实现全部业务需求 对旧数据库(如果存在旧系统)的分析及数据转换 数据库设计的审核 控制及必要调整

二 设计原则

规范命名 所有的库名 表名 域名必须遵循统一的命名规则 并进行必要说明 以方便设计 维护 查询

控制字段的引用 在设计时 可以选择适当的数据库设计管理工具 以方便开发人员的分布式设计和数据小组的集中审核管理 采用统一的命名规则 如果设计的字段已经存在 可直接引用 否则 应重新设计

库表重复控制 在设计过程中 如果发现大部分字段都已存在 开发人员应怀疑所设计的库表是否已存在 通过对字段所在库表及相应设计人员的查询 可以确认库表是否确实重复

并发控制 设计中应进行并发控制 即对于同一个库表 在同一时间只有一个人有控制权 其他人只能进行查询

必要的讨论 数据库设计完成后 数据小组应与相关人员进行讨论 通过讨论来熟悉数据库 从而对设计中存在的问题进行控制或从中获取数据库设计的必要信息

数据小组的审核 库表的定版 修改最终都要通过数据小组的审核 以保证符合必要的要求

头文件处理 每次数据修改后 数据小组要对相应的头文件进行修改(可由管理软件自动完成) 并通知相关的开发人员 以便进行相应的程序修改

三 设计技巧

分类拆分数据量大的表 对于经常使用的表(如某些参数表或代码对照表) 由于其使用频率很高 要尽量减少表中的记录数量 例如 银行的户主账表原来设计成一张表 虽然可以方便程序的设计与维护 但经过分析发现 由于数据量太大 会影响数据的迅速定位 如果将户主账表分别设计为活期户主账 定期户主账及对公户主账等 则可以大大提高查询效率

索引设计 对于大的数据库表 合理的索引能够提高整个数据库的 *** 作效率 在索引设计中 索引字段应挑选重复值较少的字段 在对建有复合索引的字段进行检索时 应注意按照复合索引字段建立的顺序进行 例如 如果对一个 万多条记录的流水表以日期和流水号为序建立复合索引 由于在该表中日期的重复值接近整个表的记录数 用流水号进行查询所用的时间接近 秒 而如果以流水号为索引字段建立索引进行相同的查询 所用时间不到 秒 因此在大型数据库设计中 只有进行合理的索引字段选择 才能有效提高整个数据库的 *** 作效率

数据 *** 作的优化 在大型数据库中 如何提高数据 *** 作效率值得关注 例如 每在数据库流水表中增加一笔业务 就必须从流水控制表中取出流水号 并将其流水号的数值加一 正常情况下 单笔 *** 作的反应速度尚属正常 但当用它进行批量业务处理时 速度会明显减慢 经过分析发现 每次对流水控制表中的流水号数值加一时都要锁定该表 而该表却是整个系统 *** 作的核心 有可能在 *** 作时被其他进程锁定 因而使整个事务 *** 作速度变慢 对这一问题的解决的办法是 根据批量业务的总笔数批量申请流水号 并对流水控制表进行一次更新 即可提高批量业务处理的速度 另一个例子是对插表的优化 对于大批量的业务处理 如果在插入数据库表时用普通的Insert语句 速度会很慢 其原因在于 每次插表都要进行一次I/O *** 作 花费较长的时间 改进后 可以用Put语句等缓冲区形式等满页后再进行I/O *** 作 从而提高效率 对大的数据库表进行删除时 一般会直接用Delete语句 这个语句虽然可以进行小表 *** 作 但对大表却会因带来大事务而导致删除速度很慢甚至失败 解决的方法是去掉事务 但更有效的办法是先进行Drop *** 作再进行重建

数据库参数的调整 数据库参数的调整是一个经验不断积累的过程 应由有经验的系统管理员完成 以Informix数据库为例 记录锁的数目太少会造成锁表的失败 逻辑日志的文件数目太少会造成插入大表失败等 这些问题都应根据实际情况进行必要的调整

必要的工具 在整个数据库的开发与设计过程中 可以先开发一些小的应用工具 如自动生成库表的头文件 插入数据的初始化 数据插入的函数封装 错误跟踪或自动显示等 以此提高数据库的设计与开发效率

避免长事务 对单个大表的删除或插入 *** 作会带来大事务 解决的办法是对参数进行调整 也可以在插入时对文件进行分割 对于一个由一系列小事务顺序 *** 作共同构成的长事务(如银行交易系统的日终交易) 可以由一系列 *** 作完成整个事务 但其缺点是有可能因整个事务太大而使不能完成 或者 由于偶然的意外而使事务重做所需的时间太长 较好的解决方法是 把整个事务分解成几个较小的事务 再由应用程序控制整个系统的流程 这样 如果其中某个事务不成功 则只需重做该事务 因而既可节约时间 又可避免长事务

适当超前 计算机技术发展日新月异 数据库的设计必须具有一定前瞻性 不但要满足当前的应用要求 还要考虑未来的业务发展 同时必须有利于扩展或增加应用系统的处理功能

lishixinzhi/Article/program/SQL/201311/16498

常量类:ConstantUtil

public class ConstantUtil {

// 数据库名称

public static final String DATABASE_NAME = "user_managerdb";

// 数据库版本号

public static final int DATABASE_VERSION = 1;

//表名

public static final String TABLE_NAME = "user_info";

//字段名

public static final String USER_ID = "userId";

public static final String USER_NAME = "username";

public static final String USER_PASSWORD = "password";

public static final String USER_ADDRESS = "address";

}

自定义SQLiteOpenHelper:MySQLiteOpenHelper

public class MySQLiteOpenHelper extends SQLiteOpenHelper {

// 定义一个SQLiteDatabase对象,对表进行相应的 *** 作

private SQLiteDatabase mDatabase;

public MySQLiteOpenHelper(Context context) {

super(context, ConstantUtilDATABASE_NAME, null,

ConstantUtilDATABASE_VERSION);

mDatabase = getWritableDatabase();

}

/

   创建表

 /

@Override

public void onCreate(SQLiteDatabase db) {

// TODO Auto-generated method stub

//sql语句

String sql = "create table " + ConstantUtilTABLE_NAME + "("

+ ConstantUtilUSER_ID + " integer primary key,"

+ ConstantUtilUSER_NAME + " text not null,"

+ ConstantUtilUSER_PASSWORD + " text not null,"

+ ConstantUtilUSER_ADDRESS + " text not null)";

dbexecSQL(sql);

}

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

// TODO Auto-generated method stub

onCreate(db);

}

/

  添加数据

  @param cv

  @return

 /

public boolean insertData(ContentValues cv){

return mDatabaseinsert(ConstantUtilTABLE_NAME, null, cv)>0;

}

/

  查询所有数据

  @return

 /

public List<Userinfo> queryData(){

List<Userinfo> userinfos=new ArrayList<Userinfo>();

//从数据库里查询数据

Cursor cursor=mDatabasequery(ConstantUtilTABLE_NAME, null, null, null, null, null, null);

if(cursor!=null){

//取出数据

while (cursormoveToNext()) {

Userinfo userinfo=new Userinfo();

userinfosetUserId(cursorgetInt(0));

userinfosetUsername(cursorgetString(1));

userinfosetPassword(cursorgetString(2));

userinfosetAddress(cursorgetString(3));

userinfosadd(userinfo);

}

}

return userinfos;

}

}

主Activity

public class MainActivity extends Activity {

// 控件

private TextView txtName, txtPwd, txtAddress;

private EditText edtName, edtPwd, edtAddress;

private ListView mListView;

// 数据库对象

private MySQLiteOpenHelper mySQLiteOpenHelper;

private UserinfoAdapter adapter;

/ Called when the activity is first created /

@Override

public void onCreate(Bundle savedInstanceState) {

superonCreate(savedInstanceState);

setContentView(Rlayoutmain);

findView();

init();

}

private void findView() {

// TODO Auto-generated method stub

edtName = (EditText) findViewById(Ridid_edit1);

edtPwd = (EditText) findViewById(Ridid_edit2);

edtAddress = (EditText) findViewById(Ridid_edit3);

mListView = (ListView) findViewById(Ridid_listview);

}

private void init() {

// TODO Auto-generated method stub

mySQLiteOpenHelper = new MySQLiteOpenHelper(MainActivitythis);

}

public void onAction(View v) {

switch (vgetId()) {

case Ridid_btn_add:

//添加数据

String userName=edtNamegetText()toString();

String userPwd=edtPwdgetText()toString();

String userAdress=edtAddressgetText()toString();

//传入参数

ContentValues cv=new ContentValues();

//列名和值

cvput(ConstantUtilUSER_NAME, userName);

cvput(ConstantUtilUSER_PASSWORD, userPwd);

cvput(ConstantUtilUSER_ADDRESS, userAdress);

//得到结果

boolean flag=mySQLiteOpenHelperinsertData(cv);

if (flag) {

ToastmakeText(MainActivitythis, "添加记录成功", ToastLENGTH_SHORT)show();

} else {

ToastmakeText(MainActivitythis, "添加记录失败", ToastLENGTH_SHORT)show();

}

break;

case Ridid_btn_query:

//查询数据

List<Userinfo> userinfos=mySQLiteOpenHelperqueryData();

if (adapter!=null) {

adapter=null;

}

adapter=new UserinfoAdapter(userinfos);

mListViewsetAdapter(adapter);

break;

default:

break;

}

}

//数据适配器

class UserinfoAdapter extends BaseAdapter{

List<Userinfo> userinfos;

public UserinfoAdapter(List<Userinfo> _userinfos){

thisuserinfos=_userinfos;

}

@Override

public int getCount() {

// TODO Auto-generated method stub

return userinfossize();

}

@Override

public Object getItem(int position) {

// TODO Auto-generated method stub

return userinfosget(position);

}

@Override

public long getItemId(int position) {

// TODO Auto-generated method stub

return position;

}

@Override

public View getView(int position, View convertView, ViewGroup parent) {

// TODO Auto-generated method stub

if(convertView==null){

convertView=LayoutInflaterfrom(MainActivitythis)inflate(Rlayoutlistview_item, null);

txtName=(TextView) convertViewfindViewById(Ridid_txt_name);

txtPwd=(TextView) convertViewfindViewById(Ridid_txt_pwd);

txtAddress=(TextView) convertViewfindViewById(Ridid_txt_address);

txtNamesetText(userinfosget(position)getUsername());

txtPwdsetText(userinfosget(position)getPassword());

txtAddresssetText(userinfosget(position)getAddress());

}

return convertView;

}

}

}

完整源码下载地址(附数据库文件查询软件+运行效果图):

保证代码质量的顺序如下:

1)代码风格

在项目开发之初,往往会制定一个代码编写的规范,实际上,这个代码规范就包含了整个项目组的代码风格。由于软件开发人员的设计习惯不同,如果不统一代码风格,一个项目中的代码将五花八门,如变量和常量的命名、接口与实现类的注释、何时回车、怎样缩进等等。一个五花八门的设计风格,必将为日后的维护与改进带来困难。

通过代码复查,一方面督促开发人员按照规范编写代码,另一方面也使开发人员自身形成良好的编程习惯。代码风格的审查,由于内容比较单一,常常可以通过一些代码复查的工具来自动完成,提高复查的效率。

2)重大缺陷

在一些关于代码复查的文章中,列出了一个常常的单子,描述了代码复查应当着重注意的重大缺陷,它们包括:存在SQL注入、易受跨站点脚本攻击、缓存区溢出、托管代码等等。项目组可以不断积累重大缺陷的审查项目,并在每次审查中逐一检查。重大缺陷审查是一个繁琐而细致的工作,如果能编写或使用一些审查软件,可以大大提高审查效率。

3)设计逻辑与思路的审查

审查是代码复查中最核心、最有价值的部分。代码风格与重大缺陷的审查,虽然重要但简单而机械,可以通过软件自动检查;而设计逻辑与思路的审查,却是复杂而有深度的审查,需要有一定理论深度和编码经验的人才能完成,而且对新手尤其重要。前面提到,新手是任何项目组不可避免的问题。

通过代码复查,让老手去指导新手,让团队整体素质得到提高。具体办法就是,在新手完成编码以后,让老手去进行代码复查,指出新手的问题,指导新手设计。这样的过程最初可能需要重构,甚至重新编码。但经过这样的过程,新手将逐渐熟练,迅速成为老手,使整体团队素质提高。

第一,小公司一般都不会接受大的项目的,很多小项目的数据表结构很简单,设计也很直来直去,有些即使设计的不合理,受限于小项目的原因,缺陷也不会被放大很多。就算出了问题,重头来过可能都不是太困难的事情。

第二,能开公司的一般都会有一定项目经验的老人带着,甚至说一个强人就够了。

第三种可能,小公司的工作是从大公司口中拿的吃剩下的,不好吃的项目,项目都有比较好的可参考的数据库表结构模式参考。

还有一点,小公司一般没有程序员的感念啦,基本是从调研、设计、开发、测试、上线、维护,所有的工作都一起协作完成,甚至连市场合同都要自己搞定,

在vsc用PHP代码把html文件里的数据存入mysql数据库。利用PHP代码,根据CSS,把HTML文字导入MYSQL数据库。文件:indexhtml,新建一个indexphp,数据库localhost,用户名root,密码root,数据名test,表test,新建5个字段。插入或更新html内容到数据库的某个字段时,需要将html中的所有双引号进行转义(在双引号前面添加一个\),否则执行sql会报错。

以上就是关于简述数据库应用系统的设计步骤(简述数据库系统构成及数据设计的原则)全部的内容,包括:简述数据库应用系统的设计步骤(简述数据库系统构成及数据设计的原则)、如何提高团队代码质量、具体的数据库设计与实现过程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/sjk/10197037.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存