Sql 自定义用户定义的数据库字段,最佳解决方案是什么?

Sql 自定义用户定义的数据库字段,最佳解决方案是什么?,sql,database,database-design,nosql,database-schema,Sql,Database,Database Design,Nosql,Database Schema,为了尽可能简短,我将使用和示例 假设我有一个简单的数据库,它有以下表: 公司-idcompany,name,createdOn 用户-iduser,idcompany,name,dob,createdOn 事件-idevent、idcompany、名称、描述、日期、createdOn 许多用户可以链接到单个公司以及多个事件,许多事件可以链接到单个公司。所有公司、用户和事件都有如上所示的公共列。但是,如果我想让我的客户能够为他们的用户和他们的事件添加自定义字段,以获得他们希望存储的任何独特的额外信

为了尽可能简短,我将使用和示例

假设我有一个简单的数据库,它有以下表:

公司-idcompany,name,createdOn 用户-iduser,idcompany,name,dob,createdOn 事件-idevent、idcompany、名称、描述、日期、createdOn 许多用户可以链接到单个公司以及多个事件,许多事件可以链接到单个公司。所有公司、用户和事件都有如上所示的公共列。但是,如果我想让我的客户能够为他们的用户和他们的事件添加自定义字段,以获得他们希望存储的任何独特的额外信息,该怎么办。这些额外字段将以公司范围为基础,而不是以每个记录为基础,因此,向用户添加自定义字段的公司会将其添加到所有用户,而不仅仅是一个特定用户。自定义字段还需要是可搜索的,并且能够报告,最好是通过某种报告向导自动报告。考虑到数据库需要有大量的流量和大量的自定义字段,什么是最好的解决方案

我目前在可能解决方案方面的研究和发现:

具有通用占位符列,如custom1、custom2等。 **这是不可行的,因为最终会有太多的自定义列,并且数据库中会存储太多的空值

每个当前表有3个表。例如:用户、用户自定义字段、用户自定义字段值。用户表是相同的。包含新字段信息(如名称、数据类型等)的用户自定义字段表和包含自定义字段值的用户自定义字段值表 **如果不是因为它的复杂性和表大小的影响,那么它更像是一个竞争者。我认为,如果我想自动报告这些字段,就不可能避免使用用户自定义字段表,因为我必须在这里存储关于如何报告这些字段的信息。但是,为了获取几乎所有的数据,您必须在用户自定义字段值表上进行一百万次联接,而且您现在将列数据存储为行,这在数据库中会产生大量流量和大量自定义字段,这一事实很快就会引起问题

为添加到系统中的每个新公司创建一个新的用户和事件表,从这些表中删除公司id,并在表名中使用它,例如user56,56是公司id。然后允许用户触发DB命令,将新的自定义列添加到表中,从而使他们能够决定它是否具有默认值或自动增量等。 **每次我看到这个解决方案时,它总是会立即被人关闭,说它将无法管理,因为最终会得到数千张表。然而,没有人真正解释他们所说的无法管理是什么意思。首先,据我的理解,更多的表实际上效率更高,搜索速度更快,因为表要小得多。第二,是的,我知道进行任何常见的表更改都很困难,但您所要做的就是运行一个脚本来更改每个公司的所有表。最后,我确实看到了使用这种方法的好处,因为它将分离公司数据,使一方不可能通过潜在的bug意外访问另一方的数据,另外,它还可能提供单独备份和恢复公司数据的能力。如果有人能详细说明为什么这被视为一个坏主意,我们将不胜感激

完全或部分转换为NoSQL数据库。 **老实说,我没有使用无模式数据库的经验,也不知道基于每个记录的动态用户定义字段将如何工作,尽管我知道这是可能的。如果有人能解释转换的含义或查询中的差异以及潜在的好处,我们将不胜感激

在每个需要额外字段的表中创建JSON列。然后将额外字段添加到该JSON对象中。 **这个解决方案的问题是,几乎不可能通过自定义列过滤数据。您将无法报告这些列,直到您收到并处理它们,您才真正知道其中包含的内容


最后,如果有人有上述未提及的解决方案,或者对我的笔记有任何想法或分歧,请告诉我,因为这是我自己能够找到或弄明白的全部

一个典型的解决方案是使用包含用户定义字段的JSON或XML列。这将是每个表中的附加列

这是最灵活的。它允许:

随时创建新字段。 不需要对现有表进行修改即可。 支持任何合理类型的字段,包括SQL中不可用的类型,即数组。 在不利方面

没有对字段进行验证。 有些数据库支持JSON,但不支持索引。 对于外键约束和表定义等内容,数据库不知道JSON。
啊,是的,这是我看到的另一个选择。我发现这个解决方案的唯一问题是,在报告数据时,几乎不可能按任何自定义字段进行搜索或筛选。甚至仅仅通过附加字段检索数据也很困难。我已经接受了这样一个事实,我将需要某种描述自定义列的表,这样我就可以自动报告我甚至不知道将存在的列。谢谢你的回复,我会用这个更新我的问题answer@KieranOldham . . . 大多数数据库现在都支持本机JSON函数。有些甚至支持JSON上的索引,我真的不知道数据库现在支持JSON列。我将通过我自己的数据库进一步研究此解决方案,谢谢。