【问题标题】:How many tables/sprocs/functions in a database is too many?数据库中有多少表/存储过程/函数太多了?
【发布时间】:2010-11-16 19:09:12
【问题描述】:

我对数据库重构很感兴趣。我处理了几个没有大量数据的数据库,只有几 GB,最多有几十万行。然而,它们有数百个——有时是数百个——表、视图、存储过程和函数。在某些地方,已经实施了使用模式的分而治之策略,这有助于解决查看表的所有权/使用情况的一些问题。但是,它并没有真正帮助对象耦合。

我们都知道integration via shared database 不是一件好事,但我们也知道它至少在一段时间内是一件非常高效的事情,因为一切都在数据库中。我们只是不像我们对对象那样将Single Responsibility Principle 应用于数据库。

编辑:我应该补充一点,我没有数据库性能问题。表并不大,最大的只有几十万行。没有真正的数据库性能问题;除非数据库模式/逻辑/实现效率非常低下(比如需要游标对结果集中的每一行执行存储过程,以便为报告预处理数据)。在您说我应该更改这些之前,重点是:我不能,因为数据库不再处于可以评估更改影响的状态。

很明显,您有时会说“够了!”并划分为多个通过消息、ETL、应用层等连接的数据库

问题是:多少才算太多?在你发疯之前,你可以拥有的 sprocs/tables/functions 数量的绝对上限是多少?

【问题讨论】:

    标签: sql-server database-design refactoring refactoring-databases


    【解决方案1】:

    首先,不要试图用面向对象的术语来考虑数据库。面向对象编程的原则根本不适用于关系数据库。

    从业务角度来看,共享数据库是一件非常好的事情。存储必须在它们之间快速传输的信息的多个数据库变得比您的数百个对象要复杂得多。在企业应用程序之间保持一致的数据是无价的。如果 GE Corp 和 General Electric Corporation 真的是两个数据库之间的同一实体,那么试图协调可能是一场噩梦。

    重构数据库是一个不错的目标,但实际上它非常复杂。除非您有需要解决的主要性能问题,或者除非您愿意致力于识别所有可能受更改影响的代码的过程,否则不要这样做。即便如此,考虑一下您是否知道所有可能更改的代码(这是数据库人讨厌、讨厌、讨厌动态代码的原因之一!)。

    通常,重构的最佳方式是添加更改并开始转换为使用新字段、sp 等,同时将旧字段保留到设定的到期日期。由于您处于年度周期,因此您需要在很长一段时间内管理这些日期。要查看是否正在使用 sps,您可以识别您不确定的那些,并向它们添加一些代码,以便在每次运行时插入到表中。如果在您的整个一年周期之后,它们还没有运行,您可以安全地消除它们。周期可能会更短,具体取决于 sp。

    如果我正在编写仅每年运行一次的内容,我通常会在 sp 名称中添加“年度”一词。但是,在您所在的位置可能并非如此,但是 sp 的功能应该让您了解它是否应该只定期运行。我不希望 usp_send 电子邮件过程每年只运行一次,但我可能希望 usp_attendance_report 可能不会经常运行。当然,正如我所说,我会将其命名为更像 usp_annual_attendance_report 的名称,您可以考虑继续做这种事情。

    但请注意,您所做的任何重构都必须在很长的周期内进行,以确保您不会删除您需要的东西。如果您的代码在源代码控制系统中(并且所有数据库表、sp、视图、UDF、触发器等都应该是),您可能可以消除一些事情,如果它们失败了,您可以立即将它们放回原处。再次,我会检查对象以确定消除它们的可能风险。

    当然,如果您有良好的自动化测试,消除开发人员的某些内容并运行测试可以帮助您了解是否仍在引用某些内容。

    如果您正在寻找一种简单的重构方法,我不知道有哪一种。重构数据库是一项耗时、有风险的活动,而且对于愿意为此付费的权力而言,它可能没有显示出足够的改进。

    重构数据库的好书是:http://www.amazon.com/Refactoring-Databases-Evolutionary-Addison-Wesley-Signature/dp/0321293533

    【讨论】:

    • 我知道,我读过关于数据库重构的书。我正在寻找一些关于生产数据库中典型的痛苦程度的指导。我只见过几个,他们似乎都很痛苦,我只是想知道有多痛苦太痛苦了。
    • 通常很痛苦。但是,如果您组织良好并仔细工作,一步一步地,并且您的所有数据访问都是通过存储过程而不是动态查询来控制的,那么它是可行的。我知道 ORM 访问也是可行的,但没有这方面的经验。一个关键是让一切都容易回滚,如果需要和测试测试测试。也没有什么可以替代真正了解您的数据库。从几件你确定不重要的事情开始,并使用这些事情来让你的系统重构到位。然后做最大的问题领域。
    【解决方案2】:

    我不确定你提到的任何事情都有一个神奇的限制。我更喜欢把东西放在一个地方,这样我就不必记住一些记录在适当的位置,而另一些记录在另一个地方。

    我更想知道所有这些工作是否会影响您的表现?如果不是,那为什么要改变它?除非它以某种可怕的方式影响性能,否则您的客户不会从您的工作中看到任何好处,那么有什么意义呢?

    如果您刚刚购买了新机器或升级了数据库服务器软件,您的客户可能会得到更好的服务。

    【讨论】:

    • 我在数据库方面没有性能问题。我面临的唯一问题是技术债务。该数据库不仅复杂,而且包含许多不再相关的字段。
    猜你喜欢
    • 2011-05-26
    • 2010-12-27
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 2019-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多