数据库设计范式 第一范式 表中的所有字段都是不可再分的。(将复合属性进行拆分) 第二范式 表中必须存在业务主键,并且非主键依赖于全部业务主键。业务主键:那些可以唯一标识出每一行业务数据的列,或是列的组合。 如果表的业务主键只有一个列组成,那么该表原生就符合第二范式。 如果表的业务主键有多个列组成,那么需要把那些非主键依赖于全部业务主键的列从表中拆分出来。 第三范式 表中的非主键列之间不能相互依赖。 范式化设计存在的问题 如何获取出一门课程包括所有章节和小节的信息? # 表关联多,查询性能越差 1. 需要查询的信息分别位于三个不同的表。 2. 并且需要经过2个关联表。 3. 如果需要查询目标数据,就需要用到5个表。 反范式化设计 主要思路是拿空间换时间,或多或少会违反范式化的设计原则,存在一定程度上的数据冗余。 课程章节 数据结构设计流程 1. 业务分析(抽象原始数据) 2. 逻辑设计 范式化设计 反范式化设计 3. 物理设计 存储引擎 数据类型 对象命名 4. 建立库表 业务分析 课程的属性 主标题、副标题、方向、分类、难度、最新、最热、时长、简介、人数、需知、收....
一条SQL更新语句如何执行 # 这个表有一个主键 ID 和一个整型字段 c mysql> create table T(ID int primary key, c int); # 如果要将 ID=2 这一行的值加 1,SQL 语句就会这么写 mysql> update T set c=c+1 where ID=2; 查询语句的那一套流程,更新语句也是同样会走一遍。 前面我们说过,在一个表上有更新的时候,跟这个表有关的查询缓存会失效,所以这条语句就会把表 T 上所有缓存结果都清空。 这也就是我们一般不建议使用查询缓存的原因。接下来,分析器会通过词法和语法解析知道这是一条更新语句。优化器决定要使用 ID 这个索引。然后,执行器负责具体执行,找到这一行,然后更新。 与查询流程不一样的是,更新流程还涉及两个重要的日志模块:redo log(重做日志)和 binlog(归档日志) 执行器和 InnoDB 引擎在执行这个简单的 update 语句时的内部流程。 执行器先找引擎取 ID=2 这一行。ID 是主键,引擎直接用树搜索找到这一行。如果 ID=2 这一行....
MySQL 基本架构示意图 全局上来看,MySQL 分为 Server 层和 存储引擎层。 Server 层 涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。 * 连接器 * 查询缓存 * 分析器 * 优化器 * 执行器 * 等… 存储引擎层 负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。不同的存储引擎共用一个 Server 层,也就是从连接器到执行器的部分。 * InnoDB * MyISAM * Memory * 等… 连接器 接器负责跟客户端建立连接、获取权限、维持和管理连接。连接命令一般是这么写的: mysql -h$ip -P$port -u$user -p 连接命令中的 mysql 是客户端工具,用来跟服务端建立连接。在完成经典的 TCP 握手后,连接器就要开始认证你的身份。 * 如果用户名或密码不对,你就会收到一个"Access denied for user"的错误 * 如果用户名....
编写网络应用程序基本步骤 案例介绍 AuthOperation: 授权操作 OrderOperation:点单操作 KeepaliveOperation:保持连接操作 数据结构设计 Message Header * version 协议版本 * opCode 不同的opCode,Message Body 对应的 operation/operation result 也是不同的,在JSON 解析时需要根据 opCode 解析到不同的 Message Body 类型。 * streamId 相当于Message ID,标识信息的唯一 ID Message Body(JSON) * operation 操作 * operation result 操作结果 length * length 长度信息值得是整个Message(Header + Body) 套接字(socket)是通信的基石,是支持 TCP/IP 协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的 IP 地址,本地进程的协议端口,远地主机的 ....
开闭原则 一个软件实体如类、模块、函数应该对扩展开放,对修改关闭。用抽象构建框架,用实现扩展细节,面向抽象编程。(继承、多态) 优点:提高软件系统的可复用性及可维护性。 ICourse public interface ICourse { Integer getId(); String getName(); Double getPrice(); } JavaCourse public class JavaCourse implements ICourse{ private Integer Id; private String name; private Double price; public JavaCourse(Integer id, String name, Double price) { this.Id = id; this.name = name; this.price = price; } public Integer getId() { return this.Id; } public String getName() { return this.name; } ....
该文章已经加密。
Netty 背景 Netty 由 Trustin Lee (韩国、Line 公司) 2004 年开发。 * 本质:网络应用程序框架 * 实现:异步、事件驱动 * 特性:高性能、可维护、快速开发 * 用于:开发服务器和客户端 为什么不直接使用 JDK NIO 直接使用 JDK NIO = 一个人在战斗。 Netty 做的更多 * 支持常用应用层协议。 * 解决传输问题:粘包、半包现象。 * 支持流量整形。 * 完善的断连、Idle 等异常处理等。 Netty 做的更好 * 规避 JDK NIO bug: epoll bug (异常唤醒空转导致 CPU 100%) JDK NIO 2.4 版本。 * API 更优化、更强大。 * 隔离变化、屏蔽细节。 * 直接用 JDK 实现,代码量太多、BUG 也多。 * Netty 已经维护了 15 年。 网络通信框架对比 Netty 没有竞争对手。 * Apache Mina (Trustin Lee 背书 Netty) * Sun Grizzly (用的少、文档少、更新少) * Apple Swift NIO、ACE 等 (其他语言、....