我的问题很简单:
我正在开发一个系统,它将安装在几家公司中。我不想在每个表中使用一个字段来将一家公司的数据与另一家公司分开,我想使用更具可扩展性的解决方案。
我的想法是为单个数据库模式建模,并为我在系统中实例化的每个公司创建一个“实例”,从而备份单个数据库或基本模式,并通过修改我的基本模式来传播每个模式的更改。简而言之,将只有一个基本或物理模式和它的许多数据实例,由唯一的模式名称引用。
这可能吗?这种技术叫什么?(我将第一次使用这个概念)如何在 IBM DB2 上实现它?
我的问题很简单:
我正在开发一个系统,它将安装在几家公司中。我不想在每个表中使用一个字段来将一家公司的数据与另一家公司分开,我想使用更具可扩展性的解决方案。
我的想法是为单个数据库模式建模,并为我在系统中实例化的每个公司创建一个“实例”,从而备份单个数据库或基本模式,并通过修改我的基本模式来传播每个模式的更改。简而言之,将只有一个基本或物理模式和它的许多数据实例,由唯一的模式名称引用。
这可能吗?这种技术叫什么?(我将第一次使用这个概念)如何在 IBM DB2 上实现它?
如果我理解正确,我认为这是不可能的。我很确定这不实用。
想象一下将一列和该列上的索引添加到您的基本架构中。在一家没有大量数据的公司中,这种变化是相当微不足道的。但是拥有数百万行的公司可能会突然发现自己的磁盘空间不足。
DBA可以通过将索引或表移动到不同的磁盘或不同的文件系统来解决该问题,但如果数据库是从您的基本模式“实例化”的,这可能是不可能的。(取决于您所说的instanced的含义,它具有特定于 DB2 的含义以及更一般的 OOP 含义。)
我认为您正在寻找的术语是“多租户”。(租户和客户在这里的意思几乎相同。) SO 有一个“多租户”标签;我给你加,不合适的可以删。IBM 的 developerWorks 库有一篇关于各种多租户架构的介绍性文章。
多租户架构的范围从“不共享”(每个租户都有自己的数据库)到“共享所有内容”(所有租户共享单个数据库中的表,每一行都有一个列来标识“拥有”该行的租户) .
在“不共享任何东西”和“共享一切”之间是“共享模式”(租户共享一个数据库;每个租户都有一个私有模式)。
最明显的区别在于定制、灾难恢复和数据隔离。这些差异也推动了架构的选择。
“无共享”使定制变得容易;更改数据库不会影响任何其他租户。灾难恢复也很简单;您只需从备份中恢复整个数据库。可以在数据库级别应用权限以实现近乎完美的隔离。
“共享一切”使定制变得困难;每一个变化都会在一定程度上影响到每个租户。容灾也难;对于单个公司的灾难,您必须将一些行(仅是单个公司“拥有”的行)恢复到每个表。数据隔离也更难,因为您部署的每个视图和查询都必须正确考虑租户标识符。忘记一次,你可能会倒闭。