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

时间:2009-07-02 14:23:34

标签: database performance database-design architecture

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

要求是:

  • 必须支持具有100个以上字段(所有常见数据类型)的业务对象
  • 系统最终将支持数十万个业务对象实例
  • 业务对象有时会显示与其他业务对象的关系中的数据和聚合
  • 用户必须能够通过其数据字段(以及相关业务对象中的字段)搜索业务对象

我可以设想的两个可能的解决方案是:

  • 具有动态模式,以便在创建新业务对象类型时,创建用于存储该对象实例的新表。对象的字段成为存储表中的列。
  • 有一个固定的架构,其中实例数据字段在基本上是一个很长的表中存储为行。

我可以看到两种方法的利弊:

  • 动态架构允许我索引搜索列
  • 动态表格的宽度可能受最大列大小限制
  • 动态模式排除/导致复制问题
  • 静态模式意味着更少甚至没有动态sql生成
  • 我的猜测是静态模式在搜索100,000多个对象时可能像狗一样执行

那么最好的选择是什么?还有另一种我没有想到的方法吗?

编辑:我给出的要求是构建一个能够支持前端用户定义的业务对象的通用系统。当然会限制这些对象如何构建和相关,但要求本身不适合谈判。

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

6 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

对你的情况不太了解......

不是编写一个通用的,一刀切的业务对象系统(这是Oracle,Microsoft,SAS等的圣杯),为什么不以典型的方式来处理需求,开发人员是否以有效的方式设计和实现用户的业务对象?

如果你的用户是典型的,他们会创造一个怪物,最终会慢慢运行,他们会讨厌它。大多数用户将数据视为Excel工作表,而不理解如下的关系:父/子。结果将构建一些疯狂的对象,并且无法解决报告。您将被迫创建脚本以手动将许多旧对象转换为更好和正确定义的对象等等......

答案 2 :(得分:2)

您的要求听起来有点associative database,前端可以编写和编辑实体。

我同意上面的KM,除非你有一个非常令人信服的理由,否则你会更好地使用传统方法。有许多开发工具和实践可以让您构建一个健壮且可扩展的系统。否则你将不得不自己实施大部分内容。

答案 3 :(得分:2)

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

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


如果你绝对必须是这种通用的,我仍然建议购买一个为此要求而设计的系统。不仅仅是存储要求,这是您的客户最不会遇到的问题;而且:如果给予这么大的自由,你如何防止客户完全搞砸了。由于客户陷入困境,一些商业系统已经满足了这一挑战而没有停业。

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

我推荐一个在概念层面工作的UI。作为示例,请参阅NORMA,一个用于对象角色建模的Visual Studio加载项(“其他”ORM)。如果您的最终用户无法负担Visual Studio Standard许可证,请将其视为仅作为示例。否则,你会发现它是可扩展的,已经产生了许多类型的工件(从各种方言的SQL到代码),并将验证模型以确定它是否有意义。最终用户还可以输入他们认为应该有效的样本数据,系统将根据模型验证数据。

如果您的客户正在制作合理的(如果是动态的)业务对象,那么存储问题将会更加简单。

答案 4 :(得分:2)

您是否考虑过基于XML的解决方案?这些要求向我建议“构建一个允许用户动态生成XML Schema的系统,并根据该模式处理XML文档。”我不太了解存储和查询XML文档以评论您的原始问题。

另一种可能性是利用NHibernate生成数据库模式的能力。如果可以动态生成业务对象,则可以生成XML映射或Fluent映射,并使用它来生成规范化的数据库模式。

答案 5 :(得分:1)

我与之交谈过的每个用户一直都希望他们的项目中有“一切”。收集需求的部分工作是引导用户,而不仅仅是写下他们所说的一切。

您唯一的希望是构建多个模板对象,他们可以添加属性,您可以编写应用程序来处理这些对象的每种类型,但允许用户在必要时仍然稍微修改每个对象。

您需要事先告知用户此类设计存在的主要缺陷。这将最终帮助你,当它运行缓慢,或者如果他们搞砸了并需要帮助修复某些东西。我会写这个。

他们真正需要多少个可能的物品?也许你可以先用你的系统设置它们。多年来我开发了几个非常可定制的系统,当用户坐在空屏幕上时,它就像头灯中的鹿。

无论如何,祝你好运。