This commit is contained in:
by931
2022-09-06 22:30:37 +08:00
parent 66970f3e38
commit 3d6528675a
796 changed files with 3382 additions and 3382 deletions

View File

@@ -460,7 +460,7 @@ ELSE
</blockquote>
<p>显然,在我们没有通过性能测试发现性能瓶颈之前就进行的性能优化,可谓“万恶之源”。存储过程确有性能优势,但在没有发现性能瓶颈时,因为性能而选择存储过程,意味着会牺牲代码的可维护性、可读性及可扩展性,带来的结果可能是得不偿失。</p>
<p>在分布式系统下SQL 存储过程带来的性能优势消散殆尽。单机版的时代已经过去。当数据量与访问量变得越来越大时,存储过程带来的性能提升已经不足以解决性能问题。由于存储过程强耦合于数据库服务器,使得对它的改造受到了诸多限制。例如,根据 AKF 的立方体模型若要实现系统的可伸缩性Scalability可以从三个维度对系统的对应层次进行分割</p>
<p><img src="assets/4fbcb250-855d-11e9-bf73-a153754b1981" alt="35156314.png" /></p>
<p><img src="assets/4fbcb250-855d-11e9-bf73-a153754b1981" alt="png" /></p>
<p>评估立方体的三个维度:</p>
<ul>
<li>X 轴的可伸缩性代表了数据或服务的复制与负载均衡:数据层采用数据库集群以及读写分离来保证。此时,存储过程不会受到 X 轴分割的影响。</li>
@@ -470,7 +470,7 @@ ELSE
<p>不管是 SQL 语句还是由 SQL 语句构成的存储过程,更擅长表达对数据表和关系的操作。例如一些跨表查询通过 SQL 的 JOIN 或者子查询会显得更加直接,查询条件用 WHERE 子句也极为方便但在针对复杂的业务逻辑处理SQL 的表达力就要远远弱于类似 Java 这样的语言了。</p>
<p>SQL 和存储过程的自动化测试一直是一个难题。虽然有的数据库提供了 SQL 单元测试的开发工具,例如 Oracle SQL Developer但是单元测试的本质是不依赖于外部资源SQL 的目的又是访问数据库,这就使得 SQL 单元测试本身就是一个悖论。类似 STK/Unit 这样的工具可以通过编写测试脚本来实现 SQL 的自动化测试但实际上它是通过编写存储过程来调用测试用例因而具有存储过程天然的缺陷。SQL 的代码调试也是一个非常大的问题。总之,一旦业务需求变得越来越繁杂,又或者业务需求频繁发生变化,维护 SQL 与存储过程会变得极为痛苦。</p>
<p>如果使用关系数据库,唯一绕不开的 SQL 场景是数据库的创建以及基础数据的生成。软件系统一旦上线投入到生产环境最难以更改的其实是数据库包括数据库样式和已有的数据。无论是升级还是迁移数据库都是最复杂的一环。为了解决这一问题就需要对数据库脚本进行版本管理。无论变更是大还是小是影响数据库样式还是数据每次变更都应该放在单独的脚本文件中并进行版本控制。这就相当于为数据库标记了检查点Checkpoint使得我们既可以从头开始部署数据库环境也可以从当前检查点开始升级或迁移。像 FlywayDB 框架就规定每次数据库变更都定义在一个单独的 SQL 文件中文件名前缀为V{N}__N 代表版本号。例如:</p>
<p><img src="assets/267b5df0-855e-11e9-922c-b3b9244af210" alt="80267566.png" /></p>
<p><img src="assets/267b5df0-855e-11e9-922c-b3b9244af210" alt="png" /></p>
<p>即使是一次小的变更,也应该在带有版本号的 SQL 脚本中体现出来,例如上图中的 V19 脚本,其实就是在 t_fields 表中添加了一个新列:</p>
<pre><code class="language-sql">ALTER TABLE t_fields ADD COLUMN format VARCHAR(200);
</code></pre>
@@ -511,7 +511,7 @@ ELSE
<p>一旦选定了框架,其实就开始了编码实现。只需要确定业务过程,就可以创建服务对象,并以过程式的方式实现业务逻辑,若需要访问数据库,就通过数据访问对象来完成查询与持久化的能力。</p>
<h3>数据模型驱动设计的过程</h3>
<p>显然,在数据模型驱动设计的过程中,设计模型与实现模型皆以分析模型为重要的参考蓝本。整个数据模型驱动设计的重头戏都压在了分析模型上。通过对业务知识的提炼,识别出实体和数据表,并正确地建立数据表之间的关系成为了数据建模最重要的工作。它是数据模型驱动设计的起点。因此,一个典型的数据模型驱动设计过程如下图所示:</p>
<p><img src="assets/3a1ac110-855f-11e9-b2bb-451f18cbdadc" alt="71999881.png" /></p>
<p><img src="assets/3a1ac110-855f-11e9-b2bb-451f18cbdadc" alt="png" /></p>
<p>你可以说这是没有太多设计含金量的过程,但对于简单的业务系统而言,无疑这是简单高效的设计方法。除了数据库性能优化与数据库设计范式之外,它对团队开发人员几乎没有技术门槛,只需掌握三个技能:一门语言的基本语法和编程技巧、一个 ORM 框架的使用方法及基本的 SQL 编写能力——就这三板斧,足矣!这也正是为何数据模型驱动设计能够大行其道的主要原因,无他,门槛低而已。</p>
</div>
</div>