【问题标题】:Stategies for coping with schema evolution? [closed]应对模式演变的策略? [关闭]
【发布时间】:2008-11-20 10:04:50
【问题描述】:

目前,我们在数据访问对象和大量存储过程和触发器中使用手动 SQL,总计约 20k 行代码。我们发现,简单的更改会导致需要几天的工作才能修复,并且会导致截止日期推迟。

更改包括修改表以处理额外数据、基于 QA/用户报告对架构进行一般重构等。它是一个非常活跃的系统,旨在取代旧的和缓慢的东西。

我们查看了可用的 PHP ORM 解决方案来尝试限制这些更改的影响,但它们太慢了,无法应对我们的架构; “简单” sql 结果的返回时间比我们的自定义查询要长几个数量级,导致约 0.5 秒的页面浏览量超过 20 秒。

在一般情况下,我可以研究哪些最佳实践/策略来应对关系数据库的架构演变?

编辑:忘了提及触发器;我们有很多数据依赖于级联变化,例如。此用户的价格更改会更新 那里 那个用户的价格,等等。

【问题讨论】:

  • 您能否举例说明需要很长时间才能实施的更改?

标签: database continuous-integration agile


【解决方案1】:

您可能想在Refactoring Databases: Evolutionary Database Design 上查看这本书。

【讨论】:

    【解决方案2】:

    我建议使用连续(或至少每晚)构建策略。
    每次签入时重建数据库,或者每天至少重建一次。
    同样每天一次,运行单元测试来运行每一位代码,无论是在存储过程、触发器还是数据访问层。

    编写存储过程的成本很高,但这会立即识别中断。
    一旦你知道中断在哪里,你就可以修复它。

    我很想听听其他人将这种策略应用于数据库更改的经验。

    【讨论】:

      【解决方案3】:

      我们使用Enterprise Architect 来定义数据库。我们包括在 UML 中定义的存储过程、触发器和所有表定义。该程序的三个出色功能是:

      1. 从 ODBC 连接导入 UML 图。
      2. 一次为整个数据库生成 SQL 脚本 (DDL)
      3. 为您的数据库生成自定义模板文档。

      在我作为开发人员的 10 多年中,我从未对任何其他工具印象深刻。 EA 一举支持 Oracle、MySQL、SQL Server(多个版本)、PostGreSQL、Interbase、DB2 和 Access。每当我遇到问题时,他们的论坛都会及时回答我的问题。强烈推荐!!

      当 DB 发生更改时,我们在 EA 中进行然后生成 SQL,并将其签入我们的版本控制 (svn)。我们使用Hudson 进行构建,它会在看到您修改了签入的 sql 时从脚本中自动构建数据库。

      【讨论】:

        【解决方案4】:

        我的建议是摆脱存储过程,而使用内联 SQL,可能在 text/xml 文件中维护。我发现 SProcs 更烦人且维护起来更耗时。一旦生成查询计划(第一次执行查询),您会注意到性能差异可以忽略不计。此外,您还可以对整个数据库脚本进行版本控制...

        【讨论】:

        • 我赞成,但是 XML 文件中的 SQL? "*FROM ..." ?
        • No.. 更像:
          不是主帖的一部分;我们存储的 procs 已经在 svn 中 - 我们先将它们编码在 txt 文件中,然后再在 db 中运行。我们拥有的几乎一切都在版本控制之下。在这种情况下,您将如何处理触发器?
        【解决方案5】:

        以下是我的建议:

        1. 尝试去掉最少使用的功能。质疑一直不使用的功能。应用程序中的每个功能都有与其相关的多个级别的成本(维护、支持、回归测试、代码复杂性等)。
        2. 远离存储过程,除非绝对没有办法在代码中以可扩展的方式高效地执行此操作。
        3. 逐步引入 ORM 解决方案(使用重构从 JDBC 迁移到 ORM)以减少 CRUD 操作中的代码量和代码复杂度
        4. 在修复错误并将这些测试合并到持续集成系统中时构建功能、集成和单元测试。尽可能自动化您的回归测试,以便在签入时尽快发现问题。
        5. 一般来说,每当您修复错误时,都要利用这个机会重构以解耦实现/代码模块。

        如果您对数据库迁移问题有任何疑问,这可能会有所帮助:http://shashivelur.com/blog/2008/07/hibernate-db-migration/

        【讨论】:

          猜你喜欢
          • 2010-09-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多