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

fle*_*esh 2 database architecture performance database-design

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

要求是:

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

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

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

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

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

那么最好的选择是什么?还有其他方法我没有想过吗?

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

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

naw*_*oth 5

我觉得你的问题非常相称的图形数据库Neo4j的,因为它是专为从一开始就要求这种灵活性.它将数据存储为节点和关系/边,并且节点和关系都可以保存任意属性(以键/值方式).与RDBMS的一个重要区别是图形数据库不需要在大型长表中查找关系(就像在固定模式解决方案中一样),因此应该会有显着的性能提升.你可以在wiki中找到关于Neo4j的语言绑定,并在这个stackoverflow线程中阅读其他人对它的看法.免责声明:我是Neo4j团队的一员.