Answers:
我要做的第一件事是创建一个实体关系图(ERD)。有时,您可以使用命令行工具简单地描述元数据,但是为了节省时间,有些工具可以自动生成图表。
其次,检查每个表和列以确保我了解其存储的含义。
第三,检查每种关系,并确保我了解表之间的关系。
第四,阅读任何视图或触发器以了解自定义数据完整性实施或级联操作。
第五,读取任何存储过程。如果有的话,还请阅读SQL访问权限。
第六,通读使用数据库的应用程序代码部分。那是执行一些其他业务规则和数据完整性规则的地方。
更新: 我刚刚读了一篇有趣的文章“ 继承数据库时要做的9件事 ”,其中有一个很好的清单。
摘要:
数据字典是您的朋友。另外,请尝试使用Visio上的逆向工程工具对数据库进行逆向工程,并构建自己的一组图。由于逆向工程是交互式的(您可以构建图表),因此与读取数据字典相比,它更具吸引力。这个过程的积极性是它的优势,我发现这样做很轻松。
我所做的大部分工作是在数据仓库中,其中围绕源系统数据库架构进行的查找是一项核心活动。我已经在很多场合做过这种事情,并且发现它确实工作得很好。
Visio pro并不昂贵,Visio建模引擎可让您在多个图表之间共享模型。另外,您可以在图表中添加缺少的外键,最后获得有用的系统文档集。
除了Bill Karwin的想法外,我建议与用户交谈-有时用户对他们的数据库用途有很多了解,特别是如果他们从数据库中进行任何报告。
对于供应商的软件,我要处理一个非常丑陋的问题,除了提出建议外,我不能做太多更改。我一直在努力改变现状,但是由于它不在我的控制范围之内,所以我陷入了困境。
由于数据库绝对没有关系,因此我快速开始使用的一件事是对模式的常规名称查询:
--Find Column named like 'blah' in a specific table
SELECT O.NAME, O.ID, C.NAME, O.XTYPE
FROM SYSOBJECTS O LEFT JOIN SYSCOLUMNS C ON O.ID=C.ID
WHERE C.NAME LIKE '%SearchFor%' AND O.XTYPE IN ('U','V') AND O.Name like '%TableName%'
ORDER by O.Name
要么
--Find all Columns in DB with name like 'blah'
SELECT O.NAME, O.ID, C.NAME, O.XTYPE
FROM SYSOBJECTS O LEFT JOIN SYSCOLUMNS C ON O.ID=C.ID
WHERE C.NAME LIKE '%SearchFor%' AND O.XTYPE IN ('U','V')
ORDER by O.Name
由于某些表中有太多命名不佳的列,并且有太多列无法浏览以查找我可能用来在表之间形成关系的内容。
我知道这在问题的重新设计部分中无济于事,但对于理解和破译不良模式非常有帮助。
SchemaCrawler是我的数据库发现工具,它具有几个功能,可以轻松浏览丑陋的数据库。SchemaCrawler具有类似“ grep”的功能,该功能使您可以使用正则表达式搜索表和列。例如,您可以搜索名称为“ ACCOUNT”的表和列,并且它们可能以某种方式相关。
即使没有外键,SchemaCrawler也会推断外键关系。它通过使用常见的命名约定找到“弱关联”来做到这一点,例如表的名称通常是复数,而列的名称则不是复数,并且列名的前缀可能是_ID。您可以使用这些推断的关系找到相关表。
取决于设计的丑陋程度,对设计的控制程度以及与之交互的方式。多年来,在我目前的工作中,我不得不与许多丑陋的数据库进行交互,这是我如何处理它们:
员工资料
有保存员工数据的数据库。它是一个供应商数据库,因此我无法控制它。(抱歉?)我无法直接访问它。我每天早上都会收到DTS转储。
我能够管理的最好的事情是编写一个脚本,该脚本清除晨间垃圾箱的输入(是故意选择单词),然后将其迁移为更有用的格式,并使用清除后的数据进行工作。
即使我可以更改它,我也可能不会-只是因为有很多其他程序依赖于它的设置方式,因此我不能强行更改它们。
在线培训数据
这是我自己设计的一团糟。我刚从大学毕业就建造了它,没有任何导师可以帮助我...自那时以来,我一直在进行一些修复。因为我控制着唯一访问数据的程序,所以当我升级网站的某些部分时,我将“升级”数据库的配置。我将编写一个转换脚本并在副本上进行强大的测试,以便可以确保进行所有需要进行的更改。
这是一个漫长的过程,但进展顺利。
课堂培训数据
我的试点项目一直在整合来自3个不同数据库的数据,这些数据均由我的前任设计……稍有不同……他是一名护士教育工作者,参加了一两次编程课程。
那是另一个缓慢的过程。由于我可以完全控制访问数据的程序,因此我一直在像在线培训数据一样对它进行一点点的更改。
回想起来,这将是开始清洁的主要候选者……后视总是20/20。
到底...
我不知道这有多大帮助,我可以详细说明(一定程度上,公司法律yada yada等等)。最终答案是“取决于”。
这取决于您如何进行交互。对于可以接受批处理的使用场景,我经常发现将数据批处理为更友好的结构并对此进行工作最经济有效(就开发时间而言,从而减少了客户的成本)。
Schema Spy是用于生成ERD的非常好的工具。
啊...丑陋的数据库,企业规模越大,我们发现的遗留数据库就越多。
它并不总是有效,但如果我们不付出努力,它只会变得更糟。我尝试重新设计数据库以及应用程序,这可能会为我增加数据迁移方面的更多工作,但是性能始终是我不可思议的魔术。
和你丑陋的女朋友祝你好运;)
查看是否可以使用“知识转移”会话的选项,如果可以,请充分利用它。
同样,许多DBMS附带了一些工具,使您可以使用一些有用的信息(即外键)来绘制/打印数据库模式。
此外,(从NXC窃取)您可以通过Visio之类的工具对数据库进行反向工程。
我喜欢启动查询分析器,并观察生产系统上发生的情况。让我对哪些表“很热”以及针对它们的查询类型有一些了解。
将备份副本放在沙盒服务器上,然后开始编写和运行测试查询。如果可以动手而不用担心会破坏它,我总是会发现一个更易于理解的复杂系统。
另外,我希望在浏览器窗口中打开“每日WTF”。接管别人的设计通常会涉及很多“我不敢相信他们做了{WTF}”的时刻,这有助于人们去了解您的痛苦。