数据库设计相关

一、数据库设计

数据库设计就是根据业务系统的具体需求,结合我们所选用的DBMS(数据库管理系统),为这个业务系统构造出最优的数据存储模型,并建立好数据库中的表结构以及表与表之间的关系的过程,使之能有效的对应用系统中的数据进行存储,并可以高效的对已经存储的数据进行访问。

  • 常用的关系型数据库:MySQL、Oracle、SQLServer、PgSql
  • NoSQL系统:Mongo、Memcache、Redis

有效存储、高效访问!

好的数据库设计
  • 减少数据冗杂;else(大量数据冗杂)
  • 避免数据维护异常;else(更新、插入、删除异常)
  • 节约存储空间;else(浪费大量的存储空间)
  • 高效的访问;else(访问数据低效)

二、数据库设计步骤

需求分析
  1. 数据是什么
  2. 属性有哪些
  3. 数据和属性各自特点有哪些
逻辑设计

使用ER图进行逻辑设计

物理设计

结合自身情况选择数据库 mysql sqlserver oracle

维护优化
  1. 新的需求进行建表
  2. 索引优化
  3. 大表的拆分

三、需求分析

为什么要进行需求分析?

  1. 了解系统中所要存储的数据
    时效性,周期性

  2. 了解数据存储的特点
    增长量大,不属于核心数据

  3. 了解数据的声明周期
    过期清理归档,分库分表

要搞清楚的一些问题

  1. 实体与实体之间的关系(1对1,1对多,多对1)

  2. 实体包含哪些属性

  3. 哪些属性组合可以唯一标识一个实体

举例说明:
以一个小型的电子商务网站为例,电商网站系统包括了几个核心模块:(用户,商品,订单,购物车,供应商)

记录用户注册信息的:
*包括属性:用户名、密码、电话、邮箱、身份证号...
可选唯一标示属性:用户名,身份证
存储特点:随着系统上线时间增加,需要永久存储(不能删除归档,可以考虑分表)

记录商品信息的:
包括属性:编码,名称,描述,种类,重量,价格,有效期...
可选唯一标示属性:商品编码
存储特点:对于下线的商品可以归档存储

记录购物车信息的:
包括属性:用户名,商品信息,加入时间,数量...
可选唯一标示属性:用户名+商品编号+加入时间,购物车编号
存储特点:不用永久存储(设置归档、清理规则)

记录订单信息:
包括属性:订单号、用户姓名、用户电话、收货地址、商品编号、商品名称、数量、价格、订单状态、支付状态、订单类型...
可选唯一标识属性:(订单号)
存储特点:永久存储(分表分库存储)

Paste_Image.png
关系

用户->n订单
用户->n购物车
n订单->n商品
n商品->n订单

四、逻辑设计

  • 将需求转化为数据库的逻辑模型

关系:表与表之间的联系
元组:表中一行为一个元组
属性:表中一列即为一个属性;每个属性都有一个名称成为属性名
候选码:表中的某个属性,可以唯一确定一个元组(主键,一个或一组属性,唯一索引)
主码:一个关系有多个候选码,选定其中一个为主码(主键)
域:属性的取值范围(男,女)
分量:元组中的一个属性值(具体值)

  • 通过er图的模型对逻辑模型进行展示

矩形:实体集,矩形内写实体集的具体名字
菱形:标示联系集
椭圆:标示实体具体的属性
线段:讲属性连接到实体集,或实体集联系到关系

er图
  • 同所选用的具体的dbms系统无关

三大范式

如果要存储用户信息和购物车信息是用一张表呢还是多张表呢?

包括:第一范式,第二范式,第三范式
这是目前我们大多数据库设计所要遵循的范式

操作异常:
  1. 插入异常
    如果某实体随着另一个实体的的存在而存在,即缺少某个实体时就无法表示这个实体,那么这个表就存在插入异常。

  2. 更新异常
    如果更改表所对应的某个实体实例的单独属性时,需要将多行更改,那么就说这个表存在更新异常。

  3. 删除异常
    如果删除表的某一行来反映某实体实例失效时导致另一个不同实体实例信息丢失,那么这个表就存在删除异常。

  4. 数据冗余:
    是指相同的数据在多个地方存在,或者说表中的某个列可以由其它列计算得到,这样就说表中存在着数据冗余。

第一范式(列不可再分):

数据库表中所有字段都是单一属性,不可再分的,这一单一属性由基本的数据类型所构成,如int,char,varchar

id name tel pwd
tel1 tel2 pwd1 pwd2
1 dp 027-88888888 13554852557 456 123456
第二范式(行不可再分):

数据库中的表,不存在非关键字段对任一候选字段的部分函数依赖的情况
部分函数依赖是指存在着组合关键字中的某一关键字决定非关键字

Paste_Image.png
第三范式:

如果数据表中不存在非关键字段对任意候选字段的传递函数依赖则符合第三范式

Paste_Image.png

五、物理设计

1.选择合适的数据库系统

oracle、sqlserver 商业数据库,成本
mysql、pgsql开源
oracle 事务成本低,适合大型事务操作,性能好
sqlserver windows系统
sqlserver开发语言 .net

  • 运用场景
    企业级项目 oracle、sqlserver
    互联网项目 mysql、pgsql

  • mysql常用引擎
    myisam 不支持事务 支持并发插入表级缩
    innodb 支持事务 支持并发行入表级锁 5.5之后

mysql可以针对不同的存储引擎的需求可以选择最优的存储引擎

2.定义数据库,表以及字段的命名规范
  • 可读性原则:
    字段使用大写和小写来格式化 驼峰命名法

  • 表意性原则:
    表名显示功能

  • 长名原则:
    尽量少用或者不用缩写

3.根据所选dbms系统选择合适的字段类型

生日:
char(10) '1990-02-19' 占用空间小
varchar(20) '1990-02-19'
datetime 1990-02-19
int 146564344

列的数据类型一方面影响数据存储的空间开销,另一方面也会影响数据查询的性能,当一个列可以选择多种数据类型时,优先选择数字类型,其次是日期或二进制类型,最后是字符类型。对于同级别的数据类型,应该优先选择占用空间小的。

tinyint    1
smallint   2
mediumint  3
int        4
bigint     8
datetime   3
timestamp  4
char       n
varchar    n

对数据进行比较操作时,字符串处理比数字慢
数据库中,数据以页为单位,列的长度越小,利于性能提升。

char varchar
(1)如果列中存储的数据长度差不多一致的,应该考虑char;身份证 手机号
(2)大于50字节用varchar
utf-8 一个字符三个字节

decimal float
(1)decimal用于存储精确数据,float用于存非精确数据
(2)float存储空间开销比decimal小

时间类型
int:字段小,但是需要时间函数转换

4.反范式化设计

反范式化是针对范式化而言,为了性能和读取效率考虑而是当的对第三范式的要求进行违反,而允许存在少量的数据冗余。
订单表 用户表 商品表 属性表

六、数据库维护和优化

1.维护数据字典
Paste_Image.png

第三方工具 写好注释 nacicat
mysql comment

2.维护索引

表结构,数据量不断变化,索引也可能不适用,当需求发生该变的时候,需要建立新的索引

3.维护表结构

变更表结构,插入列,删除列
数据字段进行维护
控制表的宽度和大小

数据库中适合的操作
批量操作 > 逐条操作
尽量少用select * 这样的查询
控制使用用户自定义函数
不要使用数据库中的全文检索

4.在适当的时候对表进行水平拆分或垂直拆分

为了控制表的宽度可以进行表的拆分
1.经常一起查询的列放到一起
2.text等大字段拆分出到附加表中

为了控制表的大小可以进行表的水平拆分分

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,026评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,655评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,726评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,204评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,558评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,731评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,944评论 2 314
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,698评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,438评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,633评论 2 247
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,125评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,444评论 3 255
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,137评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,103评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,888评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,772评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,669评论 2 271

推荐阅读更多精彩内容