全栈工程师修炼指南
熊燚(四火)
Oracle 首席软件工程师
32206 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 46 讲
全栈回顾 (1讲)
加餐 (1讲)
全栈工程师修炼指南
15
15
1.0x
00:00/00:00
登录|注册

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

对象(Object)数据库
文档(Document)数据库
列式(Columnar)数据库
键值(Key-value)数据库
第三范式(3 NF)
第二范式(2 NF)
第一范式(1 NF)
数据库表的设计优化
数据库范式的问题
从结构化数据到非结构化数据
从 Scale Up 到 Scale Out
NoSQL 数据库的分类
数据库范式
关系模型
存储技术选型
持久层代码设计
持久化框架选择
服务端 MVC 各层设计
前端设计
Web API 的设计
客户端和服务端交互
扩展阅读
总结思考
演进趋势
NoSQL
关系数据库
数据持久层设计
全栈技术下的设计
设计数据持久层

该思维导图由 AI 生成,仅供参考

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

关系数据库

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

数据库范式

数据库的表设计,可以说是全栈工程师经常需要面对的问题。而这部分,其实是有“套路”可循的,其中一些常见的规范要求,就被总结为不同的“范式”(Normal Form)。它可以说是数据库表设计的基础,对于数据库表设计很有实际的指导意义。我注意到有很多程序员朋友都不太清楚不同范式的实际含义,那么今天,就请让我通过一个尽可能简单的图书管理系统的例子,来把它讲清楚。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

全栈技术下的数据持久层设计涉及关系数据库和NoSQL数据库的原理和应用。文章介绍了关系数据库的设计和范式级别,以及NoSQL数据库在大型Web应用中的应用。作者指出NoSQL数据库具有横向扩展性、海量数据支持、易维护和低成本等优势。此外,文章还提到了关系数据库云服务的崛起,使得普通软件工程师也能完成专业数据库管理员的工作。文章还介绍了NoSQL数据库的分类,包括键值数据库、列式数据库、文档数据库和对象数据库,并探讨了持久层存储技术的演进趋势,从纵向扩展到横向扩展以及从结构化数据到非结构化数据的变化。总的来说,本文涵盖了全栈技术中关系数据库和NoSQL数据库的设计原则和应用,以及数据库管理的新趋势,对全栈工程师和数据库管理员具有重要的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《全栈工程师修炼指南》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(6)

  • 最新
  • 精选
  • 💢 星星💢
    只满足第一范式 可以拆分s三张表 user表 user_id user_name book 表 book_id book_name user_book关联表 user_id book_id borrow_date return_date

    作者回复: 👍

    2020-03-17
    3
  • 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
    1
  • BigSpinach
    感觉第三范式举得那个例子,也可以这么理解,BOOK_ID和CATEGORY_ID组成联合主键,这样CATEGORY_NAME只依赖于部分主键,这样它也不符合第二范式,不知道这样理解对不对?

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

    2019-11-17
  • 四喜
    索引的数量是有着明确限制的,一种是全局的(相当于 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
    2
  • Playmaker
    答:只满足一范式 拆分成3个表 user_id | user_name book_id | book_name user_id | book_id | borrow_date | return_date
    2023-03-01归属地:广东
收起评论
显示
设置
留言
6
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部