租户共享数据的多租户

时间:2014-02-20 17:59:03

标签: multi-tenant data-sharing

我目前正在制作一个将订阅作为多租户应用程序销售的网络应用程序。我正在使用的技术是rails。

但是,它不仅仅是使用当前应用程序的孤立租户。

每个租户都会创建产品并将其发布到应用的个人实例上。每个租户都拥有自己的用户群。

有问题的说明是租户可能会将其产品分享给其他租户,因此他们可以转售。

说明:

  

FruitShop出售苹果橙和西红柿   VegetableShop出售萝卜和胡椒铃。

     

Fruitshop将西红柿分享到其他商店。

     

VegetableShop决定从可用的共享列表中获取番茄   项目并将其添加到其库存中。

     

现在浏览蔬菜店的顾客会看到萝卜,胡椒铃和   西红柿。

     

您可以猜到,select products where tenant_id='vegetableshop_ID'将无效。

我在考虑与tenant_to_producttenant_idproduct_id甚至发布开始日期的某种price_id表格建立多对多的关系。产品将是“半租户”,其中租户ID由tenant_creator_id替换,以了解谁是原始所有者。

对我而言似乎很麻烦,添加它意味着复杂的查询,即使对于仅销售自己的产品的商店。获得销售的产品会很复杂:

select tenant_to_products.* 
where tenant_to_products.tenant_ID='current tenant' 
AND (tenant_to_products.product match publication constraints) 

for each tenant_to_product do
   # it will trigger a lot of DB call
   Display tenant_to_product.product with tenant_to_product.price

取消共享产品也意味着需要修改所有引用原始产品的tenant_to_products的复杂更新。

我不确定像这样实施这个约束是个好主意,你建议我做什么?我打算做一些愚蠢的事情还是一个不太糟糕的想法?

2 个答案:

答案 0 :(得分:3)

您需要更复杂的产品机制订阅,因为您已经解决了。听起来你走在正确的轨道上。

尽可能地提取信息。例如,不要调用表'tenant_to_product',而是将其称为'tenant_relationships',并将产品ID作为此表中的列。

然后,当租户想要提供服务时,您只需在此表'service Id'中添加一列,而无需添加整个额外的表。

为了提高性能,您可以拥有一个只读数据库服务器,其租户关系会稍有延迟更新。 Azure或类似的云服务可以轻松实现这一目标。但是,除非您的用户数量达到100万以上,否则可能不需要这样做。

我建议你考虑一下:

  • 主动/非活动(蔬菜店可能更愿意暂时停止销售西红柿,因为它们目前非常缺陷,直到种植者停止包含虫子)

  • 用于通知的服务器端服务,例如“productRemoved”服务。这些服务将批量更改,为用户提供更快的反馈。

  • 请勿删除信息,而是设置列'delete_date'和'delete_user_id'或类似内容。

  • 对产品,租户,关系等进行更改的完整审核历史记录。此表将变得非常大,因此请避免从中读取并确保更新是异步的,以便不会阻止调用方等待表更新。但从业务角度来看,这可能非常有用。

修改

如果您还没有看到相关问题,可能会有用:How to create a multi-tenant database with shared table structures?

答案 1 :(得分:2)

多租户似乎是一个明显的答案,因为您为系统提供多个客户端。

然而,作为替代方案,或许可以考虑经销商的“服务层”,这将实现一定程度的隔离,同时仍然提供集成。深入了解经销商账户如何与亚马逊等第三方合作。

我意识到这是非常抽象的推理,但也许考虑在比数据层更高层次的集成可能是有益的。

根据数据层级严格执行多租户的经验,我们发现租约有时必须在业务层(如经销商的想法)进行操作,以至于租赁成为一个棘手的概念。因此,尽早考虑替代方案可能有所帮助。