热门博客

数据库设计原理:数据建模的三个阶段

我爱IT资讯库   2021/02/22

如果你在Google或者百度上搜索数据建模,相信可以搜索出很多关于数据建模的文章,但是你会发现其中绝大部分是理论、方法论、概念等,读起来很学院派,感觉很有道理,但是心里不由在想,我到底该怎么进行数据建模呢
笔者自06年投身到IT行业中,主要活动在数据库层,数据建模,数据库设计以及数据库开发,尤其是在数据仓库领域,期间用到的数据库主要是SQL Sever和MySQL;目前正在给国内一家客户做内部IT系统的数据建模工作,主要负责数据库(MySQL)设计。自己也读过一些数据库设计方面的书 籍,在各大技术类网站上也拜读过很多神贴,大大小小的项目的数据库设计工作也参与过几十个,今天有幸和大家分享自己对数据建模的观点,任何不同观点或者反 对意见,欢迎大家发送到我的邮箱max.lee.aihua23#gmail.com;就像数据库设计一样,不可能一步到位,都是一个迭代的过程,在讨论 甚至是争论中成长!
数据建模大致分为三个阶段,概念建模阶段,逻辑建模阶段和物理建模阶段。其中概念建模和逻辑建模阶段与数据库厂商毫无关 系,换言之,与MySQL,SQL Server,Oracle没有关系。物理建模阶段和数据库厂商存在很大的联系,因为不同厂商对同一功能的支持方式不同,如高可用性,读写分离,甚至是索 引,分区等。
概念建模阶段
实际工作中,在概念建模阶段,主要做三件事:
1. 客户交流
2. 理解需求
3. 形成实体
这也是一个迭代,如果先有需求,尽量去理解需求,明白当前项目或者软件需要完成什么,不明白或者不确定的地方和客户及时交流,和客户double confirm过的需求,落实到实体(Package);但是好多时候我们需要通过先和客户交流,进而将交流结果落实到需求,之后进一步具体到实体;本文 可能会涉及到一些来自于EA(Enterprise Architect 7.1)建模术语,(EA中将每个实体视为一个Package)。这里并不对各种建模工具进行比较,如Visio,EA,PowerDesigner, ERWin等;其实作为员工的我们选择性很少,公司有哪个产品的Licence,我们就用哪个吧。
举例说明:在一个B2C电子商务网站中,这 样的需求再普通不过了:客户可以在该网站上自由进行购物!我们就以这个简单例子,对其进行细分,来讲解整个数据建模的过程,通过上面这句话,我们可以得出 三个实体:客户,网站,商品;就像Scrum(敏捷开发框架的一种)中倡导的一样每个Sprint,都要产出确确实实的东西,OK,概念建模阶段,我们就 要产出实体。客户和商品(我们将网站这个实体扔掉,不需要它。)
在创建这两个实体(Package)的时候,我们记得要讲对需求的理解,以及 业务规则,作为Notes添加到Package中,这些信息将来会成为数据字典中非常重要的一部分,也就是所谓的元数据。BTW,EA或者其他建模工具应 该都可以自动生成数据字典,只不过最终生成的格式可能不太一样。如在Customer这个Package的Notes上,我们可以这样写,用户都要通过填 写个人基本信息以及一个邮箱来注册账户,之后使用这个邮箱作为登录帐号登录系统进行交易。
在概念建模阶段,我们只需要关注实体即可,不用关注 任何实现细节。很多人都希望在这个阶段把具体表结构,索引,约束,甚至是存储过程都想好,没必要!!因为这些东西使我们在物理建模阶段需要考虑的东西,这 个时候考虑还为时尚早。可能有的人在这个阶段担心会不会丢掉或者漏掉一些实体也不用担心,现在好多公司都在采用Scrum的开发模式,只要你当前抽象出 来的实体满足当前的User Story,或者当前的User Story里面的实体,你都抽象出来了,就可以了!如果你再说,我们User Story太大,实体太多,不容易抽象,那就真没办法了,建议你们的团队重新开Sprint 计划会议。




热门内容

ajaxfileupload.js 文件上传

一,前台代码。 <input id="fileToUpload" type="... ...

ios的标志常量

1 dec 2 fixed 3 hex 4 internal 5 left 6 oct 7 right 8 scien ...

discuz删除垃圾帖子

有时候如果你的论坛被垃圾帖子占满后,会发现使用后台的删除功能还是有些慢, 我们需要先备份自己需要的帖子,然后进行下面的 ...

Hibernate的主配置文件hibernate.cfg.xml

1:hibernate的主配置文件的名字必须是hibernate.cfg.xml:   1.1:主配置文件主要分为三部分 ...

关于html base元素的使用

base元素可以用于设置页面嵌入的css文件或js文件链接的基地址。 例子: <h... ...

类型转换与强制转换

自动转换: 举一个例子:把一个小的东西放到一个大的盒子里,是件非常容易的事,不用做任何改变,在这里理解成自动转换。... ...

利用wxwidgets操纵word

最近在学习怎么用wxwidgets来操纵word,寻找之中发现MedeoSoftware,里面有很多wxwidgets的... ...

Python中的简单类型

整数 & 浮点数 整数有两种,分别是 int 和 long。其中 int 最大值是 2147483647... ...

JS-时间函数

/** * 日期范围工具类 */ var daterangeutil = (function () { /** ...
“大数据”信息平台 覆盖社区5000老年人

“大数据”信息平台 覆盖社区5000老年人

突然头疼脑热,身边没人照顾;电灯坏了、水管漏了,该找谁来帮忙修?菊园新区智慧养老项目搭建了一个为老综合服务平台... ...

在PHP中全局变量的使用详解

即使开发一个新的大型PHP程序,你也不可避免的要使用到全局数据,因为有些数据是需要用到你的代码的不同部分的。一些常见的全... ...

名称空间也可以自定义

名字空间的定义 名字空间除了系统定义的名字空间之外,还可以自己定义,定义名字空间用关键字namespace,使用名字空 ...
从量价变化中洞察主力意图

从量价变化中洞察主力意图

成份B指(399003.SZ) <script language="JavaScript" typ... ...
android 继承view类刷新页面【安卓进化十一】

android 继承view类刷新页面【安卓进化十一】

       最近做项目中发现,继承了view类的子类... ...

C# XmlSerializer 对象的Xml序列化和反序列化

    .Net程序执行时,对象都驻留在内存中;内存中的对象如果需要传递给其他系统使用;或者在... ...

hdu-1286找新朋友(欧拉函数,水题)

题目链接: 找新朋友 time limit: 2000/1000 ms (java/others)memory limi ...

java程序 处理 andrid本地帮助文档打开慢的方式

    下载本地的android自带sdk帮助文档由于有被墙的google地址,可以通... ...

RTTI学习笔记

翻看C++的书,对RTTI的讲解都很困惑,"你知道你的对象是哪个类吗","RTTI常用于调试和数据库程序"对这些讲... ...

使用axis2传输附件

服务端Service文件: import java.io.FileOutputStream; import jav... ...

sql server 的行转列

sql server中行转列在sql2005之后,sqlserver引入了pivot运算符,也即是可以旋转行为列,... ...
【Node.js基础篇】(九)使用readline模块实现Node.js的输入输出

【Node.js基础篇】(九)使用readline模块实现Node.js的输入输出

学C++的时候,有cout和cin,Java也有println和Scanner控件,Node.js也有如同... ...
iOS 应用支持4寸屏

iOS 应用支持4寸屏

iPhone 5出了,一大批应用要兼容新的分辨率,下载了Xcode 4.5,在官方那里找不到有关兼容新分辨... ...

循环执行oracle到mysql的迁移步骤及各种注意事项

改章节笔者在北京逛街的时候突然想到的...今天就有想写几篇关于循环执行的笔记,所以回家到之后就奋笔疾书的写出来发表了 ... ...
2015收获的季节

2015收获的季节

—————————————————————前言————————————————————— ———————... ...

JSP中的pageEncoding和contentType属性

关于JSP页面中的pageEncoding和contentType两种属性的区别: pageEncoding是js... ...

对XX证券报关于物联网操作系统的几个问题的答复

XX证券报提问了几个关于物联网和物联网操作系统的问题,个人表达了一些粗陋的观点,在这里发表出来,与行业朋友交流和探... ...
In语句优化

In语句优化

In语句的优化 现有两张表: CLINIC_ORGANISM 数据量:1400 LAB_DRUGRESISTITE... ...
fuzzysearch, 在JavaScript中,快速而快速的模糊搜索

fuzzysearch, 在JavaScript中,快速而快速的模糊搜索

源代码名称:fuzzysearch源代码网址:http://www.github.com/bevacqua/fuzzys ...

SQL Server里的 ISNULL 与 NULLIF

SQL Server 中有两个参数,语法:     ISNULL(check_... ...

判断SD是否存在及其容量查询

这个非常简单,直接上代码: MainActivity: package com.home.getsdinf... ...