MySQL 用户定义值 - EAV 与多表分片

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

我目前正在开发一个 Multi-Tenancy 系统,作为系统的核心功能,允许用户定义自定义类型。因此,例如,他们会根据自己的选择定义事件、帐户、订单、装运。系统中的每个用户对于他们想要管理的字段在字段方面会有不同的定义。因此,对于一个用户来说,一个订单可能有订单号、状态和截止日期,而对于另一个用户来说,它可能有 10 个字段。

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

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

下游流程还将每个单独的用户数据绑定(bind)到 jquery 网格,因此首先获取这些数据并转置数据对我来说似乎太昂贵了。当你有 10k 租户或 50k 租户时会发生什么......我知道 MySQL 在优化后可以处理这种类型的事情,但它看起来就像我搬起石头砸自己的脚。

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

我的建议。

  1. 使用域分区对系统进行分片,以便在任何特定分片中都有最大数量的租户。主目录将引用哪个租户属于哪个分片
  2. 对于每个分片,当用户定义一个类型时,创建一个新表来保存这个类型。在分片中保存一个映射表,将用户链接到他定义的类型(自定义表)。

这实际上意味着我将在一个分片中包含少量核心表和 1000 个自定义表。

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

一些注意事项

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

  2. 我会遇到与表缓存相关的问题吗?冲 table 会有问题吗?

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

  4. 已经开始开发了,别叫我换NoSQL数据库!

另一个建议是继续使用 EAV,但在分片内。你觉得这个想法怎么样?

请不要手下留情!我需要听到这一切。 提前致谢。

最佳答案

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

当你在一个实例上有数万张表时,你会遇到不同的扩展性问题,但如果你已经有了支持分片的架构,你就可以进一步分割用户,这样你就不用任何一个实例都太多了。

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

我还会研究 MySQL 的目录分区,以及将用户映射到他们的自定义表的表。以及任何其他常见(非自定义)表。您可以按用户 ID 对其中任何一个进行分区,并依靠分区修剪使 Multi-Tenancy 表的行为像小得多的表一样。

关于MySQL 用户定义值 - EAV 与多表分片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15215063/

相关文章:

c# - 运行 MySql 存储过程的最低访问级别

mysql - 如何修复 SQL 中的 'Failed to add the foreign key'

mysql - utf8 和 utf8_general_ci

mysql - MySQL推断随机查询的外键关系

asp.net-mvc - 共享数据的 Multi-Tenancy 应用程序(Asp net mvc + Entity Framework + Sql Server)

python - 值错误 : No module named 'notmigrations' during unit tests

php - 如何为 SAAS 应用程序提供自定义子域

php - 如何从具有相同架构但不同架构名称的多个表中获取数据

php - 我需要使用选择检索对象构建 sql 查询

c# - 软件即服务的最佳应用程序设计