【问题标题】:Should two applications with separate release cycles share one database具有不同发布周期的两个应用程序是否应该共享一个数据库
【发布时间】:2011-05-22 07:52:05
【问题描述】:

我们有两种产品:

  1. BI 报告(业务信息)
  2. 社交网络

产品“社交网络”是一种网络应用程序,它允许公司中的用户进行协作 - 特别是在产品“BI 报告”方面。

我们有两个产品共享的一个数据库。他们每个人在数据库中都有自己的表,并且还共享一些“用户管理”表。

每个产品都有自己的发布周期 - 当我们发布新版本的“社交网络”时,我们不会总是发布新版本的“BI 报告”。

当客户拥有“BI 报告”的“X”版本和“社交网络”的“Y”版本时,我现在对数据库升级/版本控制感到头疼。在内部,数据库有两个版本。

我认为最好的办法是将数据库一分为二——每个产品都有自己的数据库,而“社交网络”则通过“BI 报告”提供的 Web 服务获取用户管理信息。然而,我团队的其他成员认为这工作量太大,不喜欢这个想法。

有没有人在多个应用程序之间共享数据库方面有任何经验?

【问题讨论】:

    标签: database database-design architecture database-migration


    【解决方案1】:

    如果这是一个管理决策,那么我会这样处理:

    1. 按原样管理系统需要多少时间/资源?

    2. 将系统重新设计成提议的新系统需要多少时间/资源?

    3. 进行更改时管理系统需要多少时间/资源?

    假设通过进行更改可以节省一些资源,那么应该有一个投资回报期的转换期。经理将能够决定从现在到那时的时间长度是否值得当前付出的努力,而不是其他可能需要优先考虑的项目。

    【讨论】:

    • 这不是管理决策。当数据库版本不与产品版本一一对应时,如何执行数据迁移由团队决定。
    • 好的 - 但即使在团队内部,也有关于如何使用资源的决定。 - 你量化你的“头痛”了吗?
    • +1 用于尝试量化头痛。并非所有问题都值得解决:)
    【解决方案2】:

    我认为这不仅仅涉及发布周期 - 我们自己也在考虑这个问题。

    我们的编目应用程序也有 BI 方面,但我们发现 BI 部分可能会影响目录的性能。

    我提到这一点是因为您可能会发现两个应用程序的单独数据库不仅可以用于发布管理,还可以用于性能。从您的社交网络应用程序到您的 BI 应用程序的关键数据的定期“存档”可能会为您提供两全其美的优势 - 社交应用程序和发布管理方面的性能。

    不确定您的共享用户管理方面...

    【讨论】:

    • 性能是一个好点 - 我认为通过每个产品拥有一个数据库,我可以在必要时更灵活地进行优化。
    • 架构不是这里的重要部分吗?因为您的解决方案应该只与它们的特定架构相关联,所以这将允许您在同一个数据库或不同数据库中使用这两个架构。
    • @Adrian K - 是否可以强制一个模式无法访问同一数据库中的另一个模式? (我不是数据库专家)
    • 错误的问题 - users 访问数据库中的对象(例如属于给定模式的表)。因此,使用访问控制,您可以限制对模式的基于用户/角色的访问。架构只是数据库中的一组对象(最常见的是表)。
    【解决方案3】:

    我们的产品由几个不同的模块组成。客户可以选择安装哪些模块。

    所有模块共享一个处理用户登录和其他非常常见的站点范围功能的核心部分。

    更复杂的是,一些模块依赖于其他模块。我们采用了模块化方法,以便轻松获取大量代码并轻松构建新模块。

    综上所述,我们遇到了类似的情况,即每个模块都进行了版本控制,并且可能单独发布。为了解决这个问题,我们做了两件事。

    首先,每个模块都使用其当前修订号注册在一个公共数据库表中。它还将任何安全角色和操作注册到公用表中。这些检查足够通用,核心可以处理它。其次,每个模块在数据库中都有自己的模式。即:module1.Table1,module2.Table2。这允许我们在多个模块中使用相同的表名。

    当我们升级给定模块时,它只会影响它自己的 DDL(结构/数据/s'procs/views)。如果模块之间存在依赖关系,则由升级工具处理。它检查数据库以查看是否安装了相关模块的 xyz 版本(或更高版本)。如果是,则允许升级继续。如果不是,则升级中止并告诉用户他们需要先升级其他部分。

    要从中删除的主要内容是依赖项检查。如果您的模块是真正独立的并且只共享常见的安全检查,那么这并不重要。但是,如果还有其他一些重叠,则每个安装程序都需要检查版本以确保它们兼容。

    您甚至可以提供一个“完整的”安装程序,用于将两个应用程序升级到当前级别,以供那些不同步的应用程序使用。

    【讨论】:

    • 所以你在数据库中使用单独的模式,每个模式都是独立更新的。如果共享的“核心”发生变化,你会怎么做——所有模块都需要升级吗?还是有向后兼容的元素?
    • @GarethOwen:核心的处理方式与其他核心略有不同。首先,它很少改变。我能想到过去 3 年的 2 次更新。这两种情况都没有涉及弃用任何东西。我认为我们仅在它的设计上就花了 4 个月的时间,以确保它能够满足我们的需要并且只满足我们的需要。
    • 您可以将 OO 原则应用于模式;像“稳定依赖原则”这样的原则处理变化以及如何隔离它。显然,您希望将任何共享组件/架构设计为只完成一项工作并做好 - 目的是最大限度地减少可能导致其发生变化的情况。
    【解决方案4】:

    如果您更改共享表,则必须同时更新这两个应用程序。不能有单独的发布周期。

    这很明显....不是吗?

    【讨论】:

    • 这似乎很明显,但我不确定。考虑 Chris Liverly 的场景:有两个模块(A 和 B)都使用核心中的表。如果模块 A 的新版本需要更改核心,但模块 B 无需更新即可与新核心一起使用,那么我不需要模块 B 的新版本。但我认为这需要一些手动工作来确定哪个当核心发生变化时,模块仍然兼容。
    • 是的...但是如果更改了需要更改两个应用程序的数据库项目...您必须更改两个应用程序。 (显而易见)您有 3 个选项。 1:通过兼容的更改获得幸运。 2:有一个共享的发布周期。 3:单独的数据库。
    猜你喜欢
    • 2011-08-07
    • 2014-11-05
    • 2014-02-12
    • 2013-04-22
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 2014-07-01
    • 1970-01-01
    相关资源
    最近更新 更多