database - 如何处理单个数据库的不同组织?

标签 database database-design

背景
构建一个用户可以通过任何计算机访问的在线信息系统。我不想为每所大学或组织复制数据库和代码。
我只想让用户点击像 www.example.com 这样的域登录并使用它。
对于第二个用户,它也将点击相同的域 www.example.com 登录并使用它。但是他们的数据是不同的。
场景
假设一所大学有200名员工,第二所大学有150名,依此类推。
问题

Do i need to have separate employee table for each university or is it OK to have a single table with a column that has University ID?

我假设第二名最好,但假设我有 20 所大学或组织,总共有数千名员工。

What is the best approach?

同样的东西适用于所有表?这只是给你举个例子。
谢谢

最佳答案

方法将取决于数据、使用情况和客户要求/限制。

  1. 按照 duffymo 的建议使用集成模型。如果每个组织都是一个更大整体的一部分(即所有大学都是州大学委员会的一部分)并且对交叉查询访问的安全问题最小2,这可能是合适的。由于相同的模式1 并且关系是“公开”共享的,因此这种方法在每个组织之间的分离量最小。它最初会导致一个非常简单的模型,但如果需要组织特定值的关系,它可能变得非常复杂(具有复合 FK 和此类的正确用法),因为它添加了另一个维度的数据。 p>

  2. Implement multi-tenancy .这可以通过对关系的隐式过滤器(可能隐藏在 View 和存储过程之后)、不同的模式或其他特定于数据库的支持来实现。根据实现,这可能会或可能不会共享模式或关系,即使所有数据可能驻留在同一数据库中。通过隐式隔离,可以隐藏/消除一些复杂的键或关系。 Multi-Tenancy 隔离通常也会使交叉查询变得更加困难/不可能。

  3. Silo the databases完全。每个客户或“组织”都有一个单独的数据库。这意味着单独的关系和模式组。我发现这种方法使用自动化工具相对简单,但它确实需要管理多个数据库。直接交叉查询是不可能的,尽管如果有需要可以使用“链接数据库”。

尽管它不是“单个数据库”,但在我们的案例中,我们有以下限制:1) 不允许在组织之间共享/公开数据,以及 2) 每个组织都希望拥有自己的本地数据库。因此,我们的产品最终使用了筒仓方法。确保所选方法满足客户要求。

只要正确规划索引和查询,这些方法都不会遇到“数千”、“数十万”甚至“数百万”条记录的问题。但是,从一个切换到另一个可能会违反许多假设的约束,因此应尽早做出决定。


1 在此响应中,我使用“架构”来指代数据库对象(例如表、 View )的安全分组,而不是数据库模型本身。实际使用的数据库模型可以是通用的/共享的,就像我们在使用单独的数据库时所做的那样。

2 集成方法不一定不安全 - 但它本身并不具有其他设计的某些内置隔离。

关于database - 如何处理单个数据库的不同组织?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15210042/

相关文章:

mysql - 计算每列每行的数字长度

java - 在过程内动态添加的表上创建触发器

python - 如何使用大量 bool 属性创建高效的 Google-App-Engine 架构

database-design - SQLAlchemy声明性: table without any primary keys?

mysql - 如何处理从某个表中删除多个对象

database - VFP 索引并在 CDX 存在时使用 INDEX ON 保存

python - 如何从 Python 中的 csv 文件创建 SQL 数据库

mysql - 数据库建模

entity-framework - Entity Framework 端点多重性

php - 如何在mysql中存储顺序数据