MySQL用户定义的值 - EAV vs Sharding with Many tables

时间:2013-03-05 02:59:48

标签: mysql multi-tenant saas sharding entity-attribute-value

我目前正在开发一个多租户系统,该系统的核心功能允许用户定义自定义类型。因此,例如,他们将定义事件,帐户,订单,发货,无论他们选择什么。系统中的每个用户将根据字段对他们想要管理的内容进行不同的定义。因此,对于一个用户,订单可能具有订单号,状态和截止日期,而对于另一个用户,它可能具有10个字段。

我正在使用的开发人员想要使用EAV来存储这些数据。我反对这个想法。我在这个网站以及互联网上阅读了很多文章,列出了这种反设计模式的缺点,但没有提到我正在考虑的方法。我正在尝试构建这个应用程序,使其从一开始就可以扩展。

当我做数学时,如果我有1000个租户,平均每个有5种类型(5000种类型)。例如,每种类型都有1000条记录(5,000,000条记录)。每条记录平均有5个字段,在EAV模型的最低级别总共有25,000,000行。

下游流程也会将每个用户数据绑定到jquery网格,因此首先获取此数据并转置数据对我来说似乎太昂贵了。当你拥有10k租户或5万租户时会发生什么......我知道MySQL在优化时可以处理这类事情,但它似乎只是在拍摄自己的脚。

我想以另一种方式做到这一点。然而,我对我提出的建议有一种不好的感觉,因为它违背了我所知道的一切,所以我希望有一些具有实践知识的真正专家来验证或批评我的方法。如果您确认,请告诉我需要做些什么来支持它并使其正常工作。如果你批评,请告诉我在短期和长期内会遇到的陷阱。

我的提案。

  1. 使用域分区对系统进行分片,以便在任何特定分片中存在最大的租户集。主目录将引用哪个租户属于哪个分片
  2. 对于每个Shard,当用户定义类型时,创建一个新表来保存此类型。在分片中保存一个映射表,该映射表将用户链接到他定义的类型(自定义表)。
  3. 这实际上意味着我将在一个分片和1000个自定义表中拥有一些核心表。

    现在对我来说,通常在数据库中拥有那么多表通常会告诉我架构有问题或者某些设计不正确,但对于这种情况,我只是想知道它是否是一个可行的方法。在我之前的例子中,这意味着我在分片中有5000个表,每个只有1000行。这对我来说似乎比使用EAV更好。根据用户,您可以找到Type,并将数据绑定到网格。

    需要考虑的一些注意事项

    1. 多租户架构允许用户拥有自己的用户。所以我可能有1000个订阅者,但有5000个用户。因此需要管理数据库连接。我是否会遇到管理连接的问题?

    2. 我是否会遇到与表缓存相关的问题?冲洗餐桌会有问题吗?

    3. 我可以在哪里遇到此设计的性能问题?我知道主catalouge数据库可能是一个瓶颈,但这个数据库的负载不会太大。

    4. 开发已经开始了,不要让我换成NoSQL数据库!

    5. 另一个建议是继续使用EAV但是在碎片中。你怎么看待这个想法?

      请不要猛击!我需要听到这一切。 提前谢谢。

1 个答案:

答案 0 :(得分:1)

我认为在扩展数据方面,您会发现管理数千个相对较小的自定义表将比使用EAV更好。我曾在一个MySQL实例上为超过100,000个表的客户提供咨询。

当您在一个实例上有数万个表时,您将遇到不同的可伸缩性问题,但如果您已经拥有支持分片的体系结构,那么您已准备好进一步细分用户,这样您就没有了任何一个实例都太多了。

目录表非常适合放入缓存(例如memcached),因为用户到分片实例的映射很少发生变化。这将减少目录上的负载。

我还会研究MySQL对目录的分区,以及将用户映射到自定义表的表。以及任何其他常见(非自定义)表。您可以通过userid对这些中的任何一个进行分区,并依靠分区修剪来使多租户表的行为就像更小的表。