数据库设计:掌握核心原则与步骤

说实话,刚进入这个行业的时候,谈起数据库设计我是很困惑的。
但后来我遇到了几个作弊项目,也逐渐弄清楚了事情的本质。
我用一个真实的案例来阐述一下我自己的理解。

比如我之前参与的一个电商平台项目。
一开始,数据表的设计非常简单,只有几个大表叠在一起。
这样一来,我们每次查询用户购买了什么商品,都要加入十几张表,查询速度像便秘一样下降。
这让我第一次深刻认识到“聚焦一个主题”的重要性——将用户信息、订单详情、产品类别等密切相关的数据汇集在一起​​,并毫无麻烦地创建单独的表格。
然后我们的CTO说:“表不一定越多越好,但表结构清晰、精确。

有趣的是,在消除冗余方面我遇到了很多陷阱。
我记得在一个项目中,将相同的产品描述复制并粘贴到订单表中,导致每次更新产品价格时都要更改数十条订单记录。
后来,当我们重构时,我们创建了一个产品字典表,并且所有订单中仅存储产品ID。
这次,不仅请求完成速度提高了三倍,而且后端同事在价格变化时不再需要握手。
老实说,这节课比听十个练习更有效。

起初,第三范式在我的理解中非常僵化。
如果您必须从表中丢弃所有非主键列,那么就像玩跨表益智游戏一样。
后来有导师提醒我:“数据规范不是硬性规定,要看场景。
”例如,我们曾经有一个表,存储用户地址和默认地址。
直接划分会导致复杂性查询,它最终仍将存储在用户表中,但将添加默认地址标志。
我个人还没有运行过这方面的最新版本。
我记得数据是关于X的,但我建议你检查一下现代数据库的做法。

将多对多关系转换为一对多关系。
这个操作的转变我已经见过两次了。
曾几何时,这是一个游戏项目,玩家和角色之间的关系是直接使用临时表来解决的。
还有一次有某种 ERP 系统。
为了简化设计,直接在代码中处理了N对N……结果,系统一跑就崩溃了。
所以在关系定义阶段,不要怕麻烦,画个ER图慢慢过一遍。

动态适应性当然是一种艺术活动。
去年我们接管了旧系统,发现原来的设计根本没有考虑到IPv6 现在,要更改接口,请向每个表添加一个 IP 字段。
建筑师当时是对的:“设计时,应该像为数据库做瑜伽一样,可以拉伸或压缩。
”到了具体操作的时候,我深刻的体会到需要多用视图和存储过程,少用硬编码的SQL。

从需求研究的角度来看,我见过的最糟糕的事情就是新零售项目。
产品经理只想着“我想要一个表来查看用户购买了什么”,完全忘记了库存和物流。
结果上线三个月后,运营商每天都在抱怨数据不够。
所以现在我接手工作的时候,首先要画一张用户故事图,列出每个角色需要哪些数据。
即使是安全官员也必须问几个问题——你是否对数据进行了脱敏处理?是否有完整性约束?
物理结构优化。
我特别钦佩那个让我们进行性能调优的人。
有一天他半夜起来改索引,就是为了把某个查询的响应时间从3 秒减少到0.5 秒。
他经常说:“索引就像一个快递数据库柜,如果不安装,可能无法投递。
如果安装太多,快递员就会迷路。
”具体操作方面,我们使用EXPLAIN语句来测试一个慢查询,找出哪条SQL语句通过了全表扫描,然后直接对关键字段添加索引。

就测试实施而言,我建议不要将数据存储视为一个微不足道的问题。
在之前的项目中,测试环境数据未经过清理,导致生产系统上存在数百个假用户。
因此,现在我需要在该过程中添加一个步骤:使用虚拟数据运行压力测试,以查看表结构是否扭曲。
维护系统的工作更是永无休止。
十年后,我们的 CRM 系统仍在改变其索引策略。

总之,数据库设计说起来容易做起来难。
最主要的是多看多练,不要害怕踩到陷阱。
归根结底,你踩的每一个洞都是别人为你付出的教训。

请简述创建设计表(数据库)时,应把握的几点要求(单表,多表)?

数据库设计分为六个步骤。

第一步是需求分析。
了解用户想要什么、他们如何获取数据以及如何处理数据。
这是基础,也是最耗时的。
例如,在电子商务系统中,用户需要管理产品和订单。
这些数据包括产品信息和订单注册。
我还在验证中,但我的经验是,如果需求不明确,一切都没用。

第二步是概念结构设计。
将用户需求合并到概念模型中与特定数据库无关。
例如,使用E-R图绘制电子商务系统图来显示产品、订单和用户关系。
关键点,抽象核心实体和关系。

第三步是逻辑结构的设计。
将概念模型转换为特定数据库支持的数据模型。
例如,E-R图转换为MySQL表结构。
需要优化,比如减少冗余,比如给产品表添加主键。

第四步是物理结构的设计。
选择最适合逻辑结构的存储方法。
例如,电商系统的订单表采用InnoDB引擎,支持事务。
考虑存储和查询效率,比如索引设计。

第五步是数据库实现。
使用数据库语言构建数据库和表格、编写程序和导入数据。
例如,使用SQL创建表,使用Python编写程序连接数据库。
检查测试运行过程中是否存在错误,例如数据导入错误。

第六步是运维。
系统上线后将持续优化调整。
例如,电商系统分析双十一慢搜索,添加分区表。
定期备份数据,防止丢失。

设计功能、数据设计和流程设计应该结合在一起。
例如,在设计产品表时,同时设计产品搜索功能。
他们相辅相成。
例如,如果处理要求发生了变化,则计算机设计也必须改变。

自己掂量一下。