全栈工程师修炼指南
熊燚(四火)
Oracle首席软件工程师
立即订阅
2286 人已学习
课程目录
已更新 43 讲 / 共 40 讲
0/4登录后,你可以任选4讲全文学习。
课前必读 (3讲)
开篇词 | 从成长角度看,为什么你应该成为全栈工程师?
免费
学习路径 | 怎样成为一名优秀的全栈工程师?
导读 | 如何学习这个专栏?
第一章 网络协议和 Web 接口 (6讲)
01 | 网络互联的昨天、今天和明天:HTTP 协议的演化
02 | 为HTTP穿上盔甲:HTTPS
03 | 换个角度解决问题:服务端推送技术
04 | 工整与自由的风格之争:SOAP和REST
05 | 权衡的艺术:漫谈Web API的设计
06 | 特别放送:北美大厂如何招聘全栈工程师?
第二章 欢迎来到 MVC 的世界 (7讲)
07 | 解耦是永恒的主题:MVC框架的发展
08 | MVC架构解析:模型(Model)篇
09 | MVC架构解析:视图(View)篇
10 | MVC架构解析:控制器(Controller)篇
11 | 剑走偏锋:面向切面编程
12 | 唯有套路得人心:谈谈Java EE的那些模式
13 | 特别放送:选择比努力更重要
第三章 从后端到前端 (7讲)
14 | 别有洞天:从后端到前端
15 | 重剑无锋,大巧不工:JavaScript面向对象
16 | 百花齐放,百家争鸣:前端MVC框架
17 | 不一样的体验:交互设计和页面布局
18 | 千言万语不及一幅画:谈谈数据可视化
19 | 打开潘多拉盒子:JavaScript异步编程
20 | 特别放送:全栈团队的角色构成
第四章 数据持久化 (7讲)
21 | 赫赫有名的双刃剑:缓存(上)
22 | 赫赫有名的双刃剑:缓存(下)
23 | 知其然,知其所以然:数据的持久化和一致性
24 | 尺有所短,寸有所长:CAP和数据存储技术选择
25 | 设计数据持久层(上):理论分析
26 | 设计数据持久层(下):案例介绍
27 | 特别放送:聊一聊代码审查
第五章 寻找最佳实践 (6讲)
28 | Ops三部曲之一:配置管理
29 | Ops三部曲之二:集群部署
30 | Ops三部曲之三:测试和发布
31 | 防人之心不可无:网站安全问题窥视
32 | 和搜索引擎的对话:SEO的原理和基础
33 | 特别放送:聊一聊程序员学英语
第六章 专题 (7讲)
34 | 网站性能优化(上)
35 | 网站性能优化(下)
36 | 全栈开发中的算法(上)
37 | 全栈开发中的算法(下)
38 | 分页的那些事儿
39 | XML、JSON、YAML比较
40 | 全栈衍化:让全栈意味着更多
全栈工程师修炼指南
登录|注册

25 | 设计数据持久层(上):理论分析

四火 2019-11-06
你好,我是四火。
在基于 Web 的全栈技术下,每一层的设计都有共同点,当然,也有各自的特殊之处。你可以回想一下,我们曾经在第一章谈到的客户端和服务端交互以及 Web API 的设计,在第三章谈到的前端的设计,在第二章谈到的服务端 MVC 各层的设计,从前到后。那么,本章余下的内容,我们就来让整个设计层面上的体系变得完整,讲一讲最后面一层的数据持久层怎样设计。
持久层的设计包括持久化框架选择、持久层代码设计,以及存储技术选型等等,考虑到这其中有部分内容我们在第二章谈论 MVC 模型层的时候已经讲到过了,那么在这一讲和下一讲中,我就会先偏重于持久层的数据存储技术本身,再结合实际的设计案例来介绍怎样选择合适的技术来解决那些经典的实际问题。

关系数据库

关系数据库就是以“关系模型”为基础而建立的数据库,这里的关系模型说的是数据可以通过数学上的关系表示和关联起来,也就是说,关系模型最终可以通过二维表格的结构来表达。关系数据库除了带来了明确的 schema 和关系以外,还带来了对事务的支持,也就是对于强一致性的支持。

数据库范式

数据库的表设计,可以说是全栈工程师经常需要面对的问题。而这部分,其实是有“套路”可循的,其中一些常见的规范要求,就被总结为不同的“范式”(Normal Form)。它可以说是数据库表设计的基础,对于数据库表设计很有实际的指导意义。我注意到有很多程序员朋友都不太清楚不同范式的实际含义,那么今天,就请让我通过一个尽可能简单的图书管理系统的例子,来把它讲清楚。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《全栈工程师修炼指南》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(4)

  • BigSpinach
    感觉第三范式举得那个例子,也可以这么理解,BOOK_ID和CATEGORY_ID组成联合主键,这样CATEGORY_NAME只依赖于部分主键,这样它也不符合第二范式,不知道这样理解对不对?

    作者回复: 可以这样理解,不过,如果 BOOK_ID 和 CATEGORY_ID 组成联合主键,那么这个 BOOK_NAME 依赖于另外的那半个“部分主键” BOOK_ID

    2019-11-17
  • Mandalorian
    索引的数量是有着明确限制的,一种是全局的(相当于 Partition Key + Sort Key),每张表上限 20 个;一种是本地的(相当于 Partition Key 已经确定,只通过 Sort Key 索引),每张表上限 5 个。

    Partition Key + Sort Key 上限20个,不太明白,怎么样算一个啊?可以举例说明吗,谢谢。

    作者回复: 就是通过这两级联合起来构成主键。例子的话,你可以看一下 https://aws.amazon.com/blogs/database/using-sort-keys-to-organize-data-in-amazon-dynamodb/ 这里面有几个例子,比如 deviceId 是 partitionKey,而 timestamp 是 sortKey,可以存在 partitionKey 相同而 sortKey 不同的数据。

    2019-11-13
  • Middleware
    如果设计的话,可能差分成四张表
    1:用户表(用户id、用户名)
    2:图书表(图片编号、图书名称)
    3:借阅表(图书编号、用户编号、借阅时间)
    4:归还表(图书编号、用户编号、归还时间)
    当然实际情况字段可能不止这些

    作者回复: 👍,如果没有特殊原因,借阅表和归还表可以合并。

    2019-11-07
    1
  • leslie
    老师的扩展阅读确实不错:强化和补充了不少知识,对于进一步学习和提升以及真正掌握知识的这块还是蛮有用的;希望老师能在这个环节更好的分享一些东西,谢谢。
            下面来回答今天的问题:其实问题非常典型-两张表的东西放在了一张表里。另外指出老师在提供表时所疏漏的一点,字段名没有注释,实际工作中字段名没有注释一律不让通过-生产系统想都不要想上;DBA会明确告诉开发,注释写好了再发过来。开发手上其实都是DBA给的相关要求,不达要求不要发过来,合规了才给上。
            根据字段名只能大致猜测:应当拆分成用户表和用户使用表。具体做法如下:
             1)user_id、user_name作为用户基本信息表,当然这张表可能还会有一些其他的基本信息;如:phone 手机号码 address 用户住址之类的等等信息;
             2)book_id,book_name,brrow_date,return_date作为用户借书表,这张表追加一个userid与用户基本信息表关联。
          这个应当是正确的设计方式:至于范式这块我就不解释了;正确的拆分我是给出了。范式的概念不光在表的设计有,索引的设计同样有;实践中修正久了就成习惯了。
          其实键值数据库和文档数据库其中不少思想还是借鉴了关系型数据库,不然不会出现大量的no sql数据库支持类sql。基于sql 的一些缺乏灵活性上的改变而已。

    作者回复: 👍,不过关于其中的 2) 拆分得不完整:把 borrow_date、return_date 可以拆到另外一张借书关系表里面去,因为对于同一本书,book_name 这样的信息不应该出现超过一次:

    图书信息表:
    book_id / book_name

    借书关系表:
    book_id / borrower_id / borrow_date / return_date

    2019-11-06
收起评论
4
返回
顶部