Database 用户定义的数据对象-最好的数据存储策略是什么?

Database 用户定义的数据对象-最好的数据存储策略是什么?,database,performance,database-design,architecture,Database,Performance,Database Design,Architecture,我正在构建一个系统,允许前端用户定义自己的业务对象。定义业务对象涉及为该业务对象创建数据字段,然后将其与系统中的其他业务对象相关联——这是相当简单的事情。我的问题是,什么是最有效的存储策略 这些要求是: 必须支持具有100多个字段(所有常见数据类型)的业务对象 该系统最终将支持数十万个业务对象实例 业务对象有时显示与其他业务对象的关系中的数据和聚合 用户必须能够通过其数据字段(以及来自相关业务对象的字段)搜索业务对象 我可以设想的两种可能的解决办法是: 具有动态模式,以便在创建新的业务对象

我正在构建一个系统,允许前端用户定义自己的业务对象。定义业务对象涉及为该业务对象创建数据字段,然后将其与系统中的其他业务对象相关联——这是相当简单的事情。我的问题是,什么是最有效的存储策略

这些要求是:

  • 必须支持具有100多个字段(所有常见数据类型)的业务对象
  • 该系统最终将支持数十万个业务对象实例
  • 业务对象有时显示与其他业务对象的关系中的数据和聚合
  • 用户必须能够通过其数据字段(以及来自相关业务对象的字段)搜索业务对象
我可以设想的两种可能的解决办法是:

  • 具有动态模式,以便在创建新的业务对象类型时,创建一个新表来存储该对象的实例。对象的字段将成为存储表中的列
  • 有一个固定的模式,其中实例数据字段作为行存储在一个大的长表中
我可以看出这两种方法的优点和缺点:

  • 动态模式允许我为搜索列编制索引
  • 动态表的宽度可能受到最大列大小的限制
  • 动态架构排除/导致复制问题
  • 静态模式意味着更少甚至没有动态sql生成
  • 我的猜测是,当涉及到搜索100000多个对象时,静态模式可能会像狗一样执行
那么最好的解决方案是什么?还有别的方法我没想到吗

编辑:我得到的要求是构建一个能够支持前端用户定义业务对象的通用系统。当然,对于如何构建和关联这些对象会有一些限制,但需求本身并没有进行协商


我的客户是一个服务提供商,在为自己的客户服务时需要一定程度的灵活性,因此需要创建业务对象

不太了解你的处境

与其编写一个通用的一刀切的业务对象系统(这是Oracle、Microsoft、SAS等的圣杯),为什么不采用典型的方式来编写,在这种方式中收集需求,开发人员以有效的方式设计和实现用户的业务对象


如果你的用户是典型的,他们会创建一个怪物,最终运行缓慢,他们会讨厌它。大多数用户将以Excel表格的形式查看数据,而不了解父/子关系。因此,将有一些疯狂的对象建立,不可能解决的报告。您将被迫创建脚本,以手动将许多旧对象转换为更好、正确定义的对象,等等。

您的要求听起来有点像一个前端,用于合成和编辑实体


我同意上面的KM,除非你有一个非常令人信服的理由不这样做,否则你最好使用传统的方法。有许多开发工具和实践允许您构建一个健壮且可扩展的系统。否则,您将不得不自己实现大部分功能。

我不知道最好的方法,因为这听起来像是其他人已经实现的功能。如果我被要求实现这个功能,我会建议买一个轮子,而不是重新发明它

也许有一些原因你必须发明你自己的?如果是这样,那么您应该将这些原因添加到您列出的需求中


如果您必须是这种通用的,我仍然建议您购买一个针对这种需求而设计的系统。不仅仅是存储要求,这是您的客户将遇到的最小问题;还有:当你有这么多的自由时,你如何防止客户完全搞砸。一些商业系统已经在不因客户混乱而停业的情况下满足了这一挑战

如果您仍然需要自己完成这项工作,那么我建议您的要求(或者其他供应商的要求?)必须包括:允许客户正确操作,并帮助客户避免错误操作。您需要某种类型的UI来允许客户定义这些业务对象,并且UI应该验证客户构建的模型

我推荐一个在概念层面上工作的UI。例如,请参见用于对象角色建模的VisualStudio附加模块(“其他”ORM)。如果你的终端用户负担不起VisualStudio标准许可证,就把它当作一个例子。否则,您会发现它是可扩展的,已经产生了许多类型的工件(从各种方言中的SQL到代码),并将验证模型以查看它是否有意义。最终用户还可以输入他们认为有效的样本数据,系统将根据模型验证数据


如果您的客户正在生成合理的(如果是动态的)业务对象,那么存储问题就会简单得多。

我认为您的问题与图形数据库非常匹配,因为它从一开始就是为所需的灵活性而构建的。它将数据存储为节点和关系/边,节点和关系都可以保存任意属性(以键/值方式)。与a的一个重要区别是,图形数据库不需要在一个大的长表中查找关系(就像在固定模式解决方案中一样),因此应该会有显著的性能提升。您可以在中找到有关Neo4j语言绑定的信息,并在中阅读其他人对其的看法。免责声明:我是Neo4j团队的一员。

您考虑过基于XML的解决方案吗?安魂曲