32、数据库设计:规则与变通

数据库设计:规则遵循与变通之道

数据库设计:规则与变通

数据库设计的基础理念

在处理数据库中的数据时,我们需要调整思考方式。相较于使用电子表格,将数据存储和使用在实际的数据库中具有更多优势。数据库能让我们更好地控制数据的完整性、一致性和有效性,还提供了几乎无限的数据检索方式,使我们能够获取各种各样的信息。

避免基于RDBMS软件进行设计

许多人在设计数据库时,会不知不觉地陷入仅基于RDBMS软件进行设计的陷阱。他们这么做往往是因为对特定的RDBMS软件比较熟悉且有一定的使用技能。然而,这种方法并不明智,原因如下:
1. 基于RDBMS能力的错误决策 :可能会根据对RDBMS能做或不能做的感知来做出设计决策。例如,因为认为RDBMS无法实现,就决定不对给定关系施加参与度。
2. RDBMS主导设计 :会让RDBMS无意中主导数据库的设计,而不是严格根据组织的信息需求来设计。当发现RDBMS对数据库的某些方面(如字段规格和关系特征)支持有限时,这种情况就容易发生。
3. 知识限制设计 :设计会受到对RDBMS知识的限制。比如,因为不知道如何实现,就不实施关系特征。
4. 技能限制设计 :设计会受到使用RDBMS技能水平的限制。技能水平会影响数据库各个方面(如字段规格和业务规则)的实施效率和效果。
5. 设计质量问题 :这种设计方法通常会导致结构设计不当、数据完整性不足、数据不一致和信息不准确等问题。在RDBMS中定义数据库看似容易,但很可能在不知不觉中设计出糟糕的数据库。
6. 不适合组织需求 :最后,你熟悉和喜爱的RDBMS可能并不适合组织的数据库需求。

正确的设计流程

我们应该始终在不考虑任何RDBMS的情况下设计数据库的逻辑结构。这样做能让我们专注于组织的信息需求,更有可能设计出合理的结构。设计完成后,再明确如何实现数据库(如单用户应用程序、客户端/服务器、基于Web等)以及使用哪种RDBMS来促进实现。

数据库设计知识的重要性

熟悉正确数据库设计基本原则的人,比那些对数据库设计知之甚少的人,能更好地理解RDBMS及其提供的工具。这是因为了解数据库设计的人能够理解RDBMS提供某些工具的原因,以及如何使用这些工具。因此,学习和掌握良好的数据库设计技术对我们非常有好处。

数据库设计规则的变通情况

虽然我们倡导遵循正确的数据库设计技术,但在某些特定情况下,可以考虑变通规则。

可变通规则的情况

  1. 设计分析型数据库 :分析型数据库用于存储和跟踪历史及与时间相关的数据。这种数据库的表结构中通常包含计算字段,这些字段的表达式用于记录特定时刻一组数据的状态,其他字段则存储聚合函数的结果。虽然这种设计违反了正常的数据库设计规则,但由于数据的使用方式,这种违反是可以接受的。不过,建议先正确设计数据库,然后经过慎重考虑后再打破规则,要明确打破规则的原因。
  2. 提高处理性能 :这是人们最常想要打破规则的原因。当RDBMS处理多表查询或复杂报告花费过长时间时,很多人会认为修改底层表结构是解决问题的方法。例如,修改表使其包含查询或报告所需的所有字段。虽然这样做确实能提高处理速度,但会引入新问题,如不必要的重复字段和冗余数据,违反了正确的数据库设计原则。

打破规则的代价

打破规则以提高性能实际上是关于数据完整性的问题。任何为了性能(或其他原因)而打破规则的行为,都会引入数据完整性问题。我们需要思考,处理性能的提升是否值得以降低数据完整性为代价。打破规则可能会带来以下问题:
1. 数据不一致 :引入不必要的重复字段会导致数据不一致。需要确保这些字段中的数据同步,如果修改了某个重复字段的值,必须对其他重复字段进行相同的修改。
2. 数据冗余 :重复字段也会导致数据冗余。编辑包含冗余数据的字段时,必须对每个实例进行相同的修改。
3. 数据完整性受损 :打破规则通常会违反整体数据完整性的一个或多个组件,如表级完整性和关系级完整性。需要尽力弥补这种完整性的缺失。
4. 信息不准确 :如果数据库存在上述问题,就无法提供准确的信息。

提高性能的其他方法

如果想通过打破规则来提高处理性能,应将其作为最后手段。在此之前,可以尝试以下方法:
1. 增强或升级计算机硬件 :尽管成本较高,但这是提高处理性能最简单的方法。更快的CPU、更多的内存和更符合需求的打印机,都能大大减少RDBMS处理复杂查询或报告的时间。使用更大的硬盘也有助于提高磁盘密集型查询的检索速度。
2. 优化操作系统软件 :确保计算机的操作系统针对性能进行了优化,这对于联网计算机尤为重要。通过调整网络配置选项的设置,可以显著提高整体处理性能。具体的修改类型取决于所使用的操作系统软件,需要参考软件文档来确定。
3. 审查数据库结构 :确保数据库设计正确,设计不佳的数据库会导致处理性能下降。
4. 审查数据库实现 :检查数据库在RDBMS中的当前实现方式,确保充分利用了RDBMS的功能,并尽可能高效、完整地定义数据库。
5. 审查应用程序 :仔细检查用于处理数据库的应用程序。应用程序是否编写良好?是否充分利用了RDBMS提供的工具?组件是否定义明确?在某些情况下,报告打印缓慢可能是因为设计不佳,查询运行缓慢可能是因为定义不当。要确保每个查询都定义正确且高效。

记录打破规则的操作

如果经过全面考虑后,认为必须打破规则,那么必须记录每一个打破的规则和采取的每一个行动。记录这些信息很重要,因为它能让我们思考即将采取行动的后果,同时也为数据库结构的更改提供记录。如果后来发现修改没有显著提高处理性能,可以根据记录来恢复修改。需要记录的内容如下:
1. 打破规则的原因 :如提高处理性能、减少复杂报告的打印时间等,要详细清晰地说明原因。
2. 违反的设计原则 :记录对数据库设计的更改,以便在性能没有显著改善时能够恢复更改。例如,指出正在更改表的结构。
3. 修改的数据库方面 :指明要修改的具体字段、表、关系或视图。这些信息在决定恢复修改时会很有价值。
4. 具体修改内容 :确定要修改的项目后,记录对该项目所做的具体修改。例如,如果需要修改关系,记录对其特征所做的准确更改。
5. 对数据库和应用程序的预期影响 :对数据库的任何修改都会影响所有相关的终端用户应用程序。例如,更改特定表的结构可能会影响数据完整性、视图结构、基于该表构建的数据输入表单和报告(部分或全部),以及引用该表的宏或编程代码。必须列出所有影响。

将这些记录添加到数据库文档中。即使后来恢复了更改,这些记录也能防止未来再次冲动地尝试相同类型的更改。

总之,数据库设计需要我们在遵循规则和变通规则之间找到平衡。在大多数情况下,遵循正确的设计技术是确保数据库完整性的关键,但在特定情况下,经过深思熟虑的变通也是可以接受的。同时,不断学习和掌握数据库设计技术,将有助于我们更好地应对各种数据库设计挑战。

数据库设计规则变通的决策流程

为了更清晰地展示在什么情况下可以变通数据库设计规则,我们可以通过一个流程图来进行说明。

graph TD
    A[遇到性能或设计问题] --> B{是否为分析型数据库设计}
    B -- 是 --> C[可考虑打破规则,但先正确设计]
    B -- 否 --> D{是否可通过其他方式提高性能}
    D -- 是 --> E[采用其他方式提高性能]
    D -- 否 --> F[慎重考虑打破规则]
    C --> G[记录打破规则的操作]
    F --> G
    E --> H[持续监测性能和数据完整性]
    G --> H
    H -- 性能未显著提升 --> I[根据记录恢复修改]
    H -- 性能提升且数据完整 --> J[维持修改]

这个流程图展示了一个决策过程,当我们在数据库设计或使用中遇到问题时,首先判断是否是分析型数据库设计,如果是,可以考虑打破规则,但要先正确设计数据库。如果不是分析型数据库设计,则考虑是否可以通过其他方式提高性能。如果可以,就采用其他方式;如果不行,则需要慎重考虑打破规则。无论哪种情况,只要打破规则,都需要记录操作。最后,持续监测性能和数据完整性,如果性能未显著提升,就根据记录恢复修改;如果性能提升且数据完整,则维持修改。

打破规则操作记录示例表格

记录项目 详细说明 示例
打破规则的原因 详细清晰地说明打破规则的原因 提高RDBMS处理多表查询的速度
违反的设计原则 记录对数据库设计的更改,便于后续恢复 修改表结构以包含冗余字段,违反了数据冗余控制原则
修改的数据库方面 指明要修改的具体字段、表、关系或视图 修改 Orders 表中的 CustomerID 字段和 OrderDate 字段
具体修改内容 记录对项目所做的准确修改 CustomerID 字段的数据类型从 INT 改为 VARCHAR(10) ,在 OrderDate 字段后添加 DeliveryDate 字段
对数据库和应用程序的预期影响 列出所有可能受到影响的方面 影响 Orders 表的数据完整性,可能需要修改相关的数据输入表单和查询语句

这个表格可以帮助我们更规范地记录打破规则的操作,确保在后续需要时能够准确地了解和恢复修改。

总结与展望

数据库设计是一个需要综合考虑多方面因素的过程。我们既要遵循正确的设计原则,确保数据库的结构合理、数据完整,又要在特定情况下灵活变通,以满足实际需求。在面对性能问题时,不能轻易打破规则,而应优先考虑其他可行的方法。如果确实需要打破规则,一定要做好记录,以便后续的调整和维护。

学习数据库设计是一个持续的过程,随着技术的不断发展和业务需求的不断变化,我们需要不断更新知识和技能。通过掌握良好的数据库设计技术,我们能够更好地应对各种挑战,设计出高效、可靠的数据库系统。希望大家在今后的数据库设计实践中,能够灵活运用所学知识,在规则与变通之间找到最佳的平衡点。

内容概要:本文详细介绍了“秒杀商城”微服务架构的设计实战全过程,涵盖系统从需求分析、服务拆分、技术选型到核心功能开发、分布式事务处理、容器化部署及监控链路追踪的完整流程。重点解决了高并发场景下的超卖问题,采用Redis预减库存、消息队列削峰、数据库乐观锁等手段保障数据一致性,并通过Nacos实现服务注册发现配置管理,利用Seata处理跨服务分布式事务,结合RabbitMQ实现异步下单,提升系统吞吐能力。同时,项目支持Docker Compose快速部署和Kubernetes生产级编排,集成Sleuth+Zipkin链路追踪Prometheus+Grafana监控体系,构建可观测性强的微服务系统。; 适合人群:具备Java基础和Spring Boot开发经验,熟悉微服务基本概念的中高级研发人员,尤其是希望深入理解高并发系统设计、分布式事务、服务治理等核心技术的开发者;适合工作2-5年、有志于转型微服务或提升架构能力的工程师; 使用场景及目标:①学习如何基于Spring Cloud Alibaba构建完整的微服务项目;②掌握秒杀场景下高并发、超卖控制、异步化、削峰填谷等关键技术方案;③实践分布式事务(Seata)、服务熔断降级、链路追踪、统一配置中心等企业级中间件的应用;④完成从本地开发到容器化部署的全流程落地; 阅读建议:建议按照文档提供的七个阶段循序渐进地动手实践,重点关注秒杀流程设计、服务间通信机制、分布式事务实现和系统性能优化部分,结合代码调试监控工具深入理解各组件协作原理,真正掌握高并发微服务系统的构建能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值