【问题标题】:Basic database architecture for a web appWeb 应用程序的基本数据库架构
【发布时间】:2011-08-17 20:10:02
【问题描述】:

我正在尝试构建一个基于 Web 的任务管理系统。我希望不同的组织能够访问不同的任务列表。我可以想象有两种方法来设置数据库架构:

  1. 所有组织的所有任务都存储在一个表中。与组织 X 关联的任务记录具有存储 X 的 ID 号的外键。
  2. 每个组织都会收到自己的任务表。该表有一个前缀来标识它属于该组织。一个单独的表存储组织和表前缀之间的关联。

1. 与 2. 的优缺点是什么?哪个更适合缩放?此外,我正在考虑允许用户关闭和打开任务的某些属性,例如,能够跟踪您在某项任务上工作了多少时间。我想我最好通过在任务表中添加或删除字段来做到这一点。但是,由于不同的组织会有不同的配置设置,2. 是否更适合此目的?

【问题讨论】:

    标签: web-applications architecture database-design


    【解决方案1】:

    我做了这件事,我给每个“组织”自己的表,正如你所描述的。当一个新组首次访问该表支持的功能时,该表将作为基表的空副本即时创建。因此只有基础需要“维护”,如果它被改变,唯一的开销是(记住)删除婴儿表,以便可以根据改变的妈妈表重新创建它们。

    在这种情况下它工作得很好。

    【讨论】:

      【解决方案2】:

      对此的搜索词是“多租户数据库”或“多租户架构”。

      有一个简短的概述和指向来自this StackOverflow question 的有用文章的链接。

      【讨论】:

        【解决方案3】:

        让每个组织都有自己的任务表听起来不是一个好主意。这将需要在新组织加入时更改物理数据库以及从新表中读取的潜在代码更改(尽管您可以动态更改前缀)。如果你想在未来改变结构,你也会有更多的开销,例如添加新字段。随着时间的推移,这将限制您重新设计和改进的能力。此外,将负载分散到多个表意味着您需要保持索引和其他类似的东西同步。由于涉及多个表,因此备份变得更加麻烦。

        我认为最好的解决方案是使这个数据驱动,其结构类似于以下:

        **OrganisationTable**
        ORGANISATION_ID
        
        **TaskTable**
        TASK_TYPE
        
        **TasksOrganisationStatusTable**
        TASK_TYPE
        STATUS (Boolean)
        ORGANISATION_ID
        
        **TasksTable**
        ORGANISATION_ID
        TASK_TYPE
        DUE_DATE
        etc.
        

        通过这种方式,您可以动态更改活动任务、设置新组织等。在您的应用中使用缓存来提高性能。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-10-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-07-04
          • 1970-01-01
          • 2011-09-19
          相关资源
          最近更新 更多