【问题标题】:Combining databases in Drupal在 Drupal 中合并数据库
【发布时间】:2010-12-16 20:50:05
【问题描述】:

所以这是场景:

我正在构建一系列需要在同一台服务器上单独安装 Drupal-6 的活动网站。每个都使用相同的架构,但 URL 和主题不同。

我希望这些网站能够分享两种内容类型的内容,教师和赞助商。这样就会有一个包含所有教师和赞助商的数据库,然后每个单独的活动站点都可以通过节点队列从中提取。

这样就可以在任何 Drupal 安装中创建和编辑新的教师节点和赞助者节点。

共享用户表也很方便,但不是绝对必要的。

有什么想法吗?

【问题讨论】:

    标签: drupal


    【解决方案1】:

    this 对您有帮助吗?

    settings.txt中的cmets解释 如何使用 $db_prefix 共享表:

     * To provide prefixes for specific tables, set $db_prefix as an array.
     * The array's keys are the table names and the values are the prefixes.
     * The 'default' element holds the prefix for any tables not specified
     * elsewhere in the array. Example:
     *
     *   $db_prefix = array(
     *     'default'   => 'main_',
     *     'users'     => 'shared_',
     *     'sessions'  => 'shared_',
     *     'role'      => 'shared_',
     *     'authmap'   => 'shared_',
     *   );
    

    另一种方法,虽然我不知道这是否可行,但是为每个 Drupal 安装创建一个数据库,并在每个数据库中创建一个 VIEW,例如。 install1_users, install2_users 指的是共享数据库中的一个共享表shared_users。精心构造的视图应该是updatable,就像普通的表格一样。

    【讨论】:

    • 这都是假设跨多个站点的单个数据库?我真的不想那样做,尽管理论上它会起作用。想到一个巨大的数据库用于无限数量的网站,我真的感到畏缩。
    • 好吧,否则你会怎么做呢?您可以创建一个数据库集群并将负载分散到多台计算机上。许多数据库被设计成以这种方式可扩展,尽管我不知道 MySQL 在这方面的状态。
    • 该评论假设您担心数据库负载。相反,如果您担心失去概览,我不会以此为理由将数据拆分到数据库中。例如,PHPmyAdmin 按前缀对表和视图进行排序以减少混乱。如果您确实想跨数据库拆分,也许您可​​以尝试我的其他建议(见帖子)。我之前也想过这个,但我不确定它是否会奏效。
    • 感谢您提供的好信息。我正在考虑为每个站点设置单独的数据库,只有一个共享数据库用于共享表。但是这样做看起来太复杂了stackoverflow.com/questions/1743072/… ...所以会考虑单数据库方法。
    【解决方案2】:

    听起来像是 Domain Access 项目的工作,这是一套模块,提供了从一个 Drupal 安装和一个共享数据库运行一组附属站点的工具。该模块允许您跨多个站点共享用户、内容和配置。默认情况下,这些站点共享 Drupal 安装中的所有表,但 Domain Prefix 模块允许为高级用户选择动态表前缀。

    恕我直言,这比滚动自定义解决方案要好得多,后者会带来相当大的复杂性和无法升级您的网站的风险。见Share tables across instances (not recommended)

    【讨论】:

    • 谢谢基思。我为每个站点使用完全不同的域,所以除非我误解了某些东西,否则域访问并不是真正合适的。
    • 域访问支持完全唯一的域(不仅仅是子域)。检查一下 - 已经完成了大量的工作。另请参阅我上面的链接,了解该方法的过程和缺点。
    • 是的,我现在看到了。毕竟,这实际上看起来是最有希望的建议。谢谢!
    【解决方案3】:

    有几种方法可以做到这一点。

    如果可以共享单个数据库,可以使用如下前缀:

    $db_prefix = array(
      'default'   => 'main_',
      'users'     => 'shared_',
      'sessions'  => 'shared_',
      'role'      => 'shared_',
      'authmap'   => 'shared_',
    );
    

    但是,请记住,MySQL 数据库可以容纳的表数量是有硬性限制的。根据这个thread, it's 1792。如果你怀疑你会达到这个限制,你可以使用这个 hack/bug。

    $db_prefix = array(
      'default'   => '',
      'users'     => 'maindb.',
      'sessions'  => 'maindb.',
      'role'      => 'maindb.',
      'authmap'   => 'maindb.',
    );
    

    其中 maindb 是另一个包含您需要的数据的共享数据库。这不是最佳实践,但它适用于 Drupal 6(尚未在 D7 中测试)。

    【讨论】:

    • 非常有趣!我需要对此进行一些试验。
    • 根据我的经验,这比域访问等模块效果更好。它只是更清洁,而且您不会将 Yet Another Module 混入其中。
    猜你喜欢
    • 2013-03-27
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 2016-10-08
    • 2018-09-14
    • 1970-01-01
    • 2010-09-15
    相关资源
    最近更新 更多