如何为多租户应用程序实现用户定义的字段和分组:EAV、固定表模式、NoSQL

如何为多租户应用程序实现用户定义的字段和分组:EAV、固定表模式、NoSQL,nosql,field,entity-attribute-value,defined,Nosql,Field,Entity Attribute Value,Defined,我在SaaS工作,任何租户都可以有多个联系人列表,每个列表都可以有任意数量的自定义字段,该列表中的联系人可以存储任意数量的组,该列表中的联系人可以包括任意数量的组(组用于分割列表中的联系人)。 每个联系人都有一个必填字段:email_address和任意数量的用户定义字段,这些字段是为我提到的列表定义的。 我们必须能够根据联系人所在的组和用户定义的值找到列表中的联系人。 我们必须提供多达30个用户定义的字段。 我现在看到了解决这个问题的三种方法: 使用某种EAV(我们尝试这样做),但它看起来相当

我在SaaS工作,任何租户都可以有多个联系人列表,每个列表都可以有任意数量的自定义字段,该列表中的联系人可以存储任意数量的组,该列表中的联系人可以包括任意数量的组(组用于分割列表中的联系人)。 每个联系人都有一个必填字段:email_address和任意数量的用户定义字段,这些字段是为我提到的列表定义的。 我们必须能够根据联系人所在的组和用户定义的值找到列表中的联系人。 我们必须提供多达30个用户定义的字段。 我现在看到了解决这个问题的三种方法:

  • 使用某种EAV(我们尝试这样做),但它看起来相当复杂。 我们有一个表列表(租户列表),一个相关表 自定义\字段、存储列表订阅服务器的电子邮件地址的相关订阅服务器表、与订阅服务器相关的表订阅服务器\自定义\数据 和自定义字段表(订阅者自定义字段的存储值)

  • 字段表模式。这里有关于它的描述。 在这种情况下,我们将使用一个与自定义字段相关的字段,该字段将在列中存储所有自定义字段,例如,有30列存储每个可能自定义字段的值,以及一个存储列名称和用户定义字段名称映射的表。它看起来也很复杂。我们必须至少有30个索引才能通过自定义字段的值进行搜索,还有其他问题

  • 使用某种NoSQL数据库,至少用于存储用户定义的字段和列表组。 您认为这样的数据库在这里有帮助吗?如果有,如何设计用于存储自定义字段和组。 我试着研究不同类型的NoSQL,例如面向文档的MongoDb,但现在我看不出它如何帮助解决这个问题。我们可以在这里存储任意属性,但要搜索自定义字段的值,我们需要提前对它们进行索引,这样我们就必须知道我们将拥有哪些自定义字段


  • 谢谢您提供的任何相关信息。

    如果您希望所有字段都能一直被索引,请尝试使用这样的技术对所有字段进行索引。Solr的主要目的是成为一个全文搜索引擎,但它基本上是一个面向文档的数据库

    以下是对其他选项的评论:

  • EAV不好,我反对使用它。它打破了关系数据库设计的许多规则,并且不会扩展。关于堆栈溢出,我已经写了很多,所以在
    eav
    标记下搜索

  • 您不需要仅仅30个索引——您需要多达30个阶乘索引来处理任何可能的索引组合。请记住,您可以创建多列索引,这些类型的索引对于支持某些查询非常重要。当然,创建这么多索引是完全不切实际的;您需要创建索引以匹配要优化的查询。如果您不知道您将拥有哪些字段以及针对这些字段的查询,则无法进行优化

  • 像MongoDB/CouchDB这样的面向文档的数据库并不是神奇的,不管它们的拥护者如何声称它们是神奇的。它们要求您为文档编制索引以进行快速搜索,这意味着您需要知道文档的可索引字段

    在运行时创建索引是一个问题,因为它可能需要很长时间,这取决于要索引的数据量。您必须找到一种方法“脱机”运行索引创建(即,不要让用户在单个http请求期间等待),然后在完成时通知他们

  • 你应该读一下。它们使用序列化的LOB,基本上是将所有自定义属性组合成一个XML或JSON blob。因此,用户可以随时创建任意数量的附加自定义字段。但在给定的自定义字段可以进行搜索之前,您需要创建一个子表,该子表引用该字段包含给定值的行。因此,您得到的索引仅与给定用户定义的自定义字段的实例数相同。您不需要让每个字段都可以搜索


  • 使用我的用例,我将能够知道可索引字段(但仅在运行时)。租户可以定义自己的字段集(通过从一组预定义字段中选择和/或添加自己的字段描述符)。所以当他们添加一个新字段时,我应该能够启动(稀疏)索引创建。因此,对于这个特定场景,面向文档的存储是否最适合?是的,文档存储可以在这种情况下工作。请参阅上面我的编辑。至于使用blob,不清楚如何删除/编辑自定义字段。例如,用户可以删除其容器中的字段,并且应删除该容器所有实体中的字段。您能告诉我如何删除/编辑自定义字段并在所有实体中反映它吗?除此之外,例如通过使用添加/删除自定义字段,还应使用和筛选使其可用。如果发生EAV级联删除。一个字段的大小是有限的,很难预测它将达到blob大小的限制。但是很难说nosql是否能带来任何好处。比尔,你见过使用nosql作为EAV的替代方案吗?问题是用户应该在线添加/编辑/删除自定义字段,并且这些更改应该立即反映到所有实体。我宁愿说不同的行可以有不同的属性集。