数据库的坏味道 --《Refactoring Database: Evolutionary Database Design》读书笔记
2010年6月2日
多目的列(Multipurpose column)
如果一列有多个目的,就很可能存在额外的代码通过检查其它一列或多列的值来保证该数据以“正确”的方式使用。例如Person中有一个日期列,对于顾客存储生日,对于员工存储入职日期。更糟的是你能做的事受到了限制,例如,如何存储员工的生日信息?
多目的表(Multipurpose table)
类似的,一张表存储多种类型的实体时,很可能就是一个设计缺陷。例如用一个顾客表既存放个人客户,也存放公司客户信息。这种方法的问题在于个人和公司的数据是不一致的。个人有姓有名,但公司只有一个法律名称。一张通用的顾客表有些字段会对某类顾客为空,但对其它顾客非空。
冗余数据(Redundant data)
冗余数据对于操作中的数据库(Operational databases?)是一个严重问题。因为数据存储在多个位置就可能出现不一致。一个很常见的例子是在你的组织中顾客信息存储在很多不同地方。实际上很多公司没有一张他们顾客究竟是哪些人的准确列表。容易产生这样的问题:一张表中张三住在解放路,另一张表中他住民主路。实际上张三去年从解放路搬到了准海路,但他没有在你们公司的两个应用里更新地址信息。
太多列的表(Tables with too many columns)
一张表有太多列通常意味着它组织松散,想储存来自多个实体的数据。你的顾客表中可能包含了三种不同的地址(发货地址,付账地址,季节性的地址)(原文shipping, billing, seasonal?)或者几种不同的电话号码(家庭,工作地点,移动电话和其它)。或许你需要通过添加地址和电话号码表来正规化这种结构。
太多行的表(Tables with too many rows)
大表意味着性能问题。例如搜索包含百万列的表是耗时的。你或者需要利用垂直切分把一些列放到另外的表去,或者通过水平切分把一些行放到另外表去。两种策略都减少了表的大小,因而潜在的提升了性能。
聪明的列("Smart" columns)
聪明的列是数据不同位置表示不同概念。例如,客户id前4位表示客户的国内分支机构。那么客户id就是一个聪明列,因为你能解析它来获得更细粒度的信息(例如分支机构id).用文本列来储存xml数据是另一个例子。显然你能通过解析xml获得更小的数据域。聪明列通常需要在某种程度上重新组织为它们的成员数据以便数据库能更容易的将其作为独立元素进行处理。
惧怕改变(Fear of change)
如果你因为担心把某些事搞砸--例如50个访问数据库的程序 --而害怕改变你的数据库结构,那这就是最清晰的信息--该重构了。惧怕改变意味着你在技术上有一个定时炸弹。随着时间流逝问题只会更糟。
posted on 2010-06-03 20:52 Michael Peng 阅读(457) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器