如何进入一个丑陋的数据库?


26

我敢肯定你们中的许多人/正在处理一个丑陋的数据库。您知道,该数据库根本没有进行标准化,您必须在其中进行大量痛苦的查询才能获得最琐碎的数据,该数据库正在生产中并且您无法进行任何更改...您知道, “那个”。

我的问题是,您如何处理?

  • 您是否尝试建立新数据库?
  • 你放弃,让它一个人呆着吗?
  • 您能提供什么建议?

Answers:


29
  • 我要做的第一件事是创建一个实体关系图(ERD)。有时,您可以使用命令行工具简单地描述元数据,但是为了节省时间,有些工具可以自动生成图表。

  • 其次,检查每个表和列以确保我了解其存储的含义。

  • 第三,检查每种关系,并确保我了解表之间的关系。

  • 第四,阅读任何视图或触发器以了解自定义数据完整性实施或级联操作。

  • 第五,读取任何存储过程。如果有的话,还请阅读SQL访问权限。

  • 第六,通读使用数据库的应用程序代码部分。那是执行一些其他业务规则和数据完整性规则的地方。


更新: 我刚刚读了一篇有趣的文章“ 继承数据库时要做的9件事 ”,其中有一个很好的清单。

摘要:

  1. 后备
  2. 研究(我上面提到的模式文档步骤)
  3. 与前开发人员交谈
  4. 错误数据库
  5. 源代码控制
  6. 与用户和/或企业主交谈
  7. 通过修复一些问题或进行一些增强来与用户建立信誉
  8. 创建开发环境
  9. 丢弃过时的对象

13

这并非总是可能的,但是在某些情况下对我有用的一件事是用视图替换某些表。然后,您可以整理下面的表格,并在某些情况下最终处置视图。如我所说,仅在某些情况下有效。


在Oracle中,物化视图也可以提供帮助。
Leigh Riffel

9

数据字典是您的朋友。另外,请尝试使用Visio上的逆向工程工具对数据库进行逆向工程,并构建自己的一组图。由于逆向工程是交互式的(您可以构建图表),因此与读取数据字典相比,它更具吸引力。这个过程的积极性是它的优势,我发现这样做很轻松。

我所做的大部分工作是在数据仓库中,其中围绕源系统数据库架构进行的查找是一项核心活动。我已经在很多场合做过这种事情,并且发现它确实工作得很好。

Visio pro并不昂贵,Visio建模引擎可让您在多个图表之间共享模型。另外,您可以在图表中添加缺少的外键,最后获得有用的系统文档集。


6

除了Bill Karwin的想法外,我建议与用户交谈-有时用户对他们的数据库用途有很多了解,特别是如果他们从数据库中进行任何报告。


6

对于供应商的软件,我要处理一个非常丑陋的问题,除了提出建议外,我不能做太多更改。我一直在努力改变现状,但是由于它不在我的控制范围之内,所以我陷入了困境。

由于数据库绝对没有关系,因此我快速开始使用的一件事是对模式的常规名称查询:

--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

由于某些表中有太多命名不佳的列,并且有太多列无法浏览以查找我可能用来在表之间形成关系的内容。

我知道这在问题的重新设计部分中无济于事,但对于理解和破译不良模式非常有帮助。


6

SchemaCrawler是我的数据库发现工具,它具有几个功能,可以轻松浏览丑陋的数据库。SchemaCrawler具有类似“ grep”的功能,该功能使您可以使用正则表达式搜索表和列。例如,您可以搜索名称为“ ACCOUNT”的表和列,并且它们可能以某种方式相关。

即使没有外键,SchemaCrawler也会推断外键关系。它通过使用常见的命名约定找到“弱关联”来做到这一点,例如表的名称通常是复数,而列的名称则不是复数,并且列名的前缀可能是_ID。您可以使用这些推断的关系找到相关表。


5

取决于设计的丑陋程度,对设计的控制程度以及与之交互的方式。多年来,在我目前的工作中,我不得不与许多丑陋的数据库进行交互,这是我如何处理它们:

员工资料

有保存员工数据的数据库。它是一个供应商数据库,因此我无法控制它。(抱歉?)我无法直接访问它。我每天早上都会收到DTS转储。

我能够管理的最好的事情是编写一个脚本,该脚本清除晨间垃圾箱的输入(是故意选择单词),然后将其迁移为更有用的格式,并使用清除后的数据进行工作。

即使我可以更改它,我也可能不会-只是因为有很多其他程序依赖于它的设置方式,因此我不能强行更改它们。

在线培训数据

这是我自己设计的一团糟。我刚从大学毕业就建造了它,没有任何导师可以帮助我...自那时以来,我一直在进行一些修复。因为我控制着唯一访问数据的程序,所以当我升级网站的某些部分时,我将“升级”数据库的配置。我将编写一个转换脚本并在副本上进行强大的测试,以便可以确保进行所有需要进行的更改。

这是一个漫长的过程,但进展顺利。

课堂培训数据

我的试点项目一直在整合来自3个不同数据库的数据,这些数据均由我的前任设计……稍有不同……他是一名护士教育工作者,参加了一两次编程课程。

那是另一个缓慢的过程。由于我可以完全控制访问数据的程序,因此我一直在像在线培训数据一样对它进行一点点的更改。

回想起来,这将是开始清洁的主要候选者……后视总是20/20。

到底...

我不知道这有多大帮助,我可以详细说明(一定程度上,公司法律yada yada等等)。最终答案是“取决于”。


5

因此,在阅读完所有答案后,我给你我的:

首先,我查找“主表”,然后用笔和纸开始映射与其他表的关系,此后,如果要查看一些应用程序代码,我将开始就数据流向进行一些粗略的草绘。

在获得关于数据库工作原理的漂亮图片之后,我只是开始检查要更改的地方。而已。

我不知道为什么,但是我更喜欢纸而不是任何数据库建模软件。


5

由于外部应用程序使用它,因此您无法更改数据库“接口”。我不知道您使用的是哪种类型的数据库(oracle,mysql,mssql),但是我将其视为一种方式:

  • 通过使用此类对象作为视图和存储过程来构建数据库接口。
  • 逐步重构(规范化,字段重命名...)
  • 更改客户的申请(如果需要)

视图,存储过程将隐藏内部数据库的修改(更改)。


4

除了发现数据库的结构之外,我还发现查看数据质量也很重要。一旦理解了每一列的含义,就可以查找缺少很多值的任何地方。随着您对数据的熟悉,您还可以检查不同列中的值之间的不一致之处。


4

这取决于您如何进行交互。对于可以接受批处理的使用场景,我经常发现将数据批处理为更友好的结构并对此进行工作最经济有效(就开发时间而言,从而减少了客户的成本)。


4

如果您可以将问题分解为可以将您的大脑包起来的问题,则可以一次进行攻击。有时候,只要知道有一张桌子没有被所有的人拼凑起来,就可以让您从中受益。这样,您扩展了“干净的地方”,从而以块的形式包含了更多的数据库。


4

如果您具有Visio(Microsoft Office的一部分),则可以尝试反向工程功能。它虽然不漂亮,但是至少会给您一个入门(仅是像Rational Rose这样的“真实”工具的成本的一小部分)。



3

比尔给出了一个很好的答案。我要补充一点,我将以测试用户身份登录到用户界面,并尝试准确了解用户对数据的处理方式。它将帮助您了解某些存储过程或设计背后的原因。理解数据的含义和用途对于理解数据库至关重要。

如果数据库是您通常不熟悉的业务功能或主题(例如,它确实进行了航班计划,并且您以前只从事财务应用程序),请向用户索取有关该主题的一些阅读材料或前往图书馆您自己或在Internet上搜索有关主题。询问用户是否需要了解法律或法规问题。同样,该主题背景中的某些内容可以解释似乎是奇怪的设计选择。


3

如果它是供应商数据库(并且我已经看到一些非常糟糕的数据库),您所能做的就是向供应商投诉。

对于内部构建的应用程序,通常只需要对开发人员进行一些培训,您就可以开始更改架构,从而提高性能。这需要时间,并且通常是一个缓慢的过程。

以我的经验,构建新数据库并不是真正的选择,因为移动数百GB或TB的数据并不是那么可行。

通常也不选择单独放置它。随着数据库中数据量的增长,性能将变得越来越差(我看到这些问题时,通常会感到非常糟糕)。最终,由于性能太差,用户将无法使用该应用程序。


3

啊...丑陋的数据库,企业规模越大,我们发现的遗留数据库就越多。

  • 人们发现性能问题之前,他们不会抱怨这种数据库。因此,在我们的组织中,我们确定单个查询并将其微调为补丁。
  • 现在限制数据了,我们知道臭垃圾在哪里,因此请尝试避免数据流通过此类数据库。创建登台数据库,然后将数据重定向到这些表开始并使用旧数据库作为数据转储。
  • 避免数据ho积存档/截断不再需要的旧数据。应该有一个团队来决定数据库中数据需要多长时间。之后,您可以将其移至平面文件,甚至移至磁带驱动器。
  • 一旦可以实现数据重定向和截断就将其逐步淘汰。说服其他团队开始使用新数据库。

它并不总是有效,但如果我们不付出努力,它只会变得更糟。我尝试重新设计数据库以及应用程序,这可能会为我增加数据迁移方面的更多工作,但是性能始终是我不可思议的魔术。

和你丑陋的女朋友祝你好运;)


2

查看是否可以使用“知识转移”会话的选项,如果可以,请充分利用它。

同样,许多DBMS附带了一些工具,使您可以使用一些有用的信息(即外键)来绘制/打印数据库模式。

此外,(从NXC窃取)您可以通过Visio之类的工具对数据库进行反向工程。


2

我喜欢启动查询分析器,并观察生产系统上发生的情况。让我对哪些表“很热”以及针对它们的查询类型有一些了解。


1

将备份副本放在沙盒服务器上,然后开始编写和运行测试查询。如果可以动手而不用担心会破坏它,我总是会发现一个更易于理解的复杂系统。

另外,我希望在浏览器窗口中打开“每日WTF”。接管别人的设计通常会涉及很多“我不敢相信他们做了{WTF}”的时刻,这有助于人们去了解您的痛苦。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.