在可怕的数据库上编写好的代码是否有希望?


18

这是我的困境。我最近继承的几个程序之一是在后端使用可怕的数据库构建的。尊敬的创作者显然不喜欢关系概念。每个客户的表,称为唯一客户ID。八十三个隐式命名的字段。该代码都是带有数十个串联的内联SQL语句的程序性代码。

由于没有为我们提供可在同一数据库上运行的重要辅助应用程序,因此我不得不从头开始重新创建它。我是唯一的开发人员,这甚至都不是我的主要职责,因为我至少有一半的时间被操作员占用。从现在开始,不可避免的期限是30天。

尽管我没有经验,但是我敢肯定我可以设计出比以前更好的数据库和现有应用程序,但是我真的认为改变数据库,调整现有应用程序并确保我没有这样做是不现实的。在需要快速创建附加应用程序的同时不要破坏任何内容。

因此,假设我陷入了可怕的数据库。需要使用这样一个糟糕的结构,我写的任何符合它的东西,是否只会增加堆积如山的技术债务,直到一些事情完全崩溃或需要新功能时才被搁置?除了可以运行的应用程序之外,我该如何处理这种情况并从中获得好处?

编辑:如果有人感兴趣,我们最终将这个可怕的数据库及其上运行的应用程序报废了。我们将辅助应用程序的创建(我没有参与设置)外包给了最终两个不同的承包商,他们最终都落在了我们头上,却一无所获。我最终不得不在三天之内赶出一个恐怖的,具有部分功能的修补程序,而该修补程序至今仍在使用。


2
试想一下,如何对特殊情况“ 2 + 2”未返回4的库进行编码。这并不容易。

8
因此,我所听到的全部是您有30天的时间可以找到另一份工作。尝试careers.stackoverflow.com ;-)
史蒂芬·A·洛


@gnat:甚至没有。
罗伯特·哈维

Answers:


27

有希望,但这是一场艰苦的战斗,尤其是如果没有人意识到数据库设计是可怕的。您可以尝试通过抽象层将复杂性抽象化,但是可能不值得一战。

我的建议是在数据库上创建足够的抽象,以使应用程序本身是干净的且经过适当设计。这样,即使您可以修复数据库,该应用程序也不会受到影响,因为它不在乎数据库的设计方式。

这是我在处理现有数据库时通常使用的方法,并且经常以零思想进行设计。存储库或网关模式的一些选择应用程序,以及与网关/存储库进行通信的某些服务层,应有助于隔离不良的设计。


1
+1在完全阅读您的答案之前,我基本上在我的答案中说了同样的话,但是由于您的答案涵盖了相同的内容,因此我看不到删除答案的方法。
Ominus 2011年

正如我对提出此建议的其他人的评论一样,这是一个很好的建议,但是很可能如果数据库设计很糟糕,那么应用程序代码也很可能也很糟糕。如果应用程序代码也应该重构,我看不出要解决这个问题。
maple_shaft

3
@maple_shaft同意,但是OP要求他从头开始创建一个将与数据库交互的新应用程序。在这种情况下,正确创建应用程序确实很有意义。
韦恩·莫利纳

1
@maple_shaft,应用程序唯一的废话部分将是与废话数据库交互的部分。这就是N层架构和SOC的重点。
StuperUser 2011年

1
@maple_shaft的目标是将数据库放入各种“黑匣子”中,并为应用程序提供一个更理想的接口,并且不一定代表数据库设计。
Michael Dean

10

构建一个处理所有数据库内容的接口层,然后编写您的应用程序以与之交互。如果数据库曾经被“修复”,则只需替换/更新“接口”即可。这种方法为我处理了一个错误的数据库或正在为其他应用程序提供服务且无法处理的数据库时,为我节省了大量时间。


您如何删除自己的答案,或者这是不可能的?
Ominus 2011年

您可以删除自己的答案。您会不断看到带有有色背景的邮件,并且会显示类似“被所有者删除”的字样。除了您以外,只有具有主持人权限的人才能看到它。
Marjan Venema

@Ominus:应该可以,但是为什么要这么做?您有3个投票!
FrustratedWithFormsDesigner

1
@Marjan:主持人和任何拥有> 10K代表的人。
杰里·科芬

1
您为什么要删除此答案?我认为这是一个很好的解决方案。
Jim G.

6

哎呀……您继承了一场噩梦,您有30天的时间可供组织使用,而您有一半的时间都花在了运营任务上?

我相信您可以重构,但肯定不能在那段时间内完成。

要回答您的问题,我认为您实际上无法在这种设计上编写好的代码。技术债务已经太多了。如果我是您,那么我将尽我所能,并在以后有更多时间和团队中的人员更好地解决这个问题时,要求进行完整的重构。

请小心推动重构。有时,高层人士会决定购买产品的源代码和所有权,而他们又不想认为自己完全浪费了钱。对我来说,在一份工作中就是这种情况。不幸的是,管理人员在购买此类软件时会做出决定,他们从未获得技术参与来评估他们所购买的产品并查看其是否可维护并承担大量技术债务。在这种情况下,错误的决定是一项政治决定,推动重构可能会危及您的工作。


尽管其他所有人都不熟悉编程,但我已经弄清楚了此代码库的质量将如何影响可维护性。他们正在全力以赴地进行工作,以使所有内容都处于更合适的状态,因此我没有危害我工作的风险,但我认为本月不会发生这种情况。
John Straka

3
有时,在您首次使用该项目时会遇到成功的黑客攻击,因此您可以为以后的项目重构同一应用程序。悲伤但真实。首先,他们必须相信您知道自己在做什么,然后他们才会考虑任何根本性的改变。可以肯定的是,海报处于困境中。
HLGEM 2011年

1
@John,这很不错,他们可以识别重构的需求。这是长期管理良好的标志,也是实际重构的第一步。
maple_shaft

3
+1是一个不错的现实答案。您有一个月的时间,但实际上只有半个月,因为您半场工作。这是11到15天,具体取决于您是否周末休假。我讨厌这样说,但是我同意您最好的选择是将所有可以立即使用的东西放在一起,并记下以后如何改进或重写它,尤其是因为您的管理层支持重构。
Bob Murphy

6

可以像其他代码一样重构数据库。修复受编写和编写测试所需的代码影响的部分,以确保没有其他中断。像其他任何重构一样,一次执行一小部分。关于数据库重构的一本好书可能会帮助您开始清理混乱。 http://www.amazon.com/Refactoring-Databases-Evolutionary-paperback-Addison-Wesley/dp/0321774515/ref=sr_1_1?ie=UTF8&qid=1307025831&sr=8-1

也有其他的,但是我个人已经阅读并使用了其中的技术。

并且不要忘记,您可以通过创建视图来重组查询数据库的方式,从而为您完成讨厌的转换工作,使其成为易于查询的结构。


这一切都很好,但是我强烈怀疑如果数据库设计一团糟,那么应用程序代码也可能毫无价值。
maple_shaft

@maple_shaft,这可能是我的经验,即使是优秀的应用程序开发人员也会设计出可怕的数据库。无论哪种方式,只有逐步重构才能解决问题,即使我确信他会喜欢,他也不能完全取代它。
HLGEM 2011年

+1 @HLGEM,这些都是好点。如果应用程序代码设计合理,则您的建议是正确的。重构零件可能是最好的方法,但是在我的整个职业生涯中,我从未见过成功的工作。但是,这可能是由于项目管理不善,而不是因为这是一个不合理的想法。
maple_shaft

5

为了最大程度地发挥作用,请创建可更新的视图以还原某些“关系”并提供更有意义的列名。


这将是一个好的开始。如果数据库被非规范化,那么我将添加触发器或存储过程以使应用程序与非规范化隔离。
凯文·克莱恩

4

一种可能是建立第二个数据库,该数据库的结构(至少与您的需求相近),并在两个数据库之间建立复制。然后,您可以针对新数据库编写代码,并且仍然保留现有数据库(和应用程序)完整,以便在您有更多时间处理时。

坦白地说,您是否可以在大约15天的时间内做到这一点仍然存在很多问题。特别是,它可能取决于您是否需要双向复制(即,您的新应用程序实际上将更新数据)还是仅一种方式(您的新应用程序仅允许人们查看数据)。后一种情况(当然)非常容易处理。

如果您需要双向复制,则很可能没有足够的时间来完成这项工作。特别是,涉及大量转换结构的双向复制从来都不是一件容易的事,并且可用的工具通常对它的支持非常差(例如,必须为两个方向上的所有数据转换手动编写所有SQL)。

如果您只需要单程,那么它可能会成为现实。这也将取决于是否你被允许花钱不少与否-也有相当多的数据仓库应用程序被用于正是这种任务的,可能会使它颇有几分更快,更容易来管理-但大多数都不便宜。


+1,这也是一个好主意,只要所有应用程序数据访问代码都与其他层正确分离,并且可以将数据访问代码重构为与新模式一起使用
maple_shaft
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.