2013-03-04 62 views
3

背景
建立一个online information system哪个用户可以通过任何计算机访问。我不想为每个大学或组织复制数据库和代码。
我只是想让用户打到像www.example.com这样的域名登录并使用它。
对于第二个用户,它也会碰到相同的域名www.example.com登录并使用它。但他们的数据是不同的。
场景
假设一所大学有200名员工,第二所大学有150名,等等。
Qusetion
如何处理单个数据库的不同组织?

我是否需要有独立的职员表,每所大学还是确定有一个表与具有大学ID列?

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

什么是最佳方法?

这同样的事情是所有表?这只是给你一个例子。
谢谢

+2

可以使用具有大学ID的列的单个表。 – 2013-03-04 20:02:20

回答

3

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

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

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

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

即使它不是“一个DB”,在我们的例子中,我们没有允许过份额/暴露组织之间的数据如下限制1),2)每个组织希望自己的本地数据库。因此,我们的产品最终采用了筒仓方法。确保选择的方法符合客户的要求。

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


在该响应我使用“模式”指数据库对象的安全分组(例如表,视图),而不是数据库模型本身。实际使用的数据库模型可以是通用/共享的,就像我们使用单独的数据库时一样。

综合方法并不一定是不安全的 - 但它本质上并不具有其他设计的某些内置隔离。

2

我会规范化它有大学和雇员表,并有他们之间的一对多关系。

您必须小心确保只有与某所大学相关的人才能看到他们的数据。基于角色的访问将很重要。

2

这被称为多租户体系结构。你应该阅读:

http://msdn.microsoft.com/en-us/library/aa479086.aspx

我会去与租客每架构,这意味着复制在不同的模式结构,但是,你应该保留所有的SQL DDL的源代码控制,这是很容易脚本。

如果在同一张桌子上这样做,很容易搞砸和“泄漏”租户之间的信息。

+0

thnx这真的很有帮助。 – 2013-05-27 17:25:53