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

标签 database performance database-design architecture

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

要求是:

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

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

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

我可以看到两种方法的优缺点:

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

那么最好的解决方案是什么?还有其他我没有想到的方法吗?

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

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

最佳答案

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

关于database - 用户定义的数据对象——什么是最好的数据存储策略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1074688/

相关文章:

sql - 固定时间表DB设计

php - 拉拉维尔。如果数据库正在播种,则禁用观察者方法

python - 应用引擎 : Structured Property vs Reference Property for one-to-many relationship

java - 如何从Sqlite中获取记录

ruby-on-rails - Heroku 上的简单 Rails 应用程序性能

java - 如果字符串长度相等,则恢复为自然排序顺序

python - 在 python 中搜索非常长的文本文件中的单词的简单方法是什么?

database-design - 如何使用 MySQL 表表示规则?

php - 如何从数据库的时间戳字段过滤php中的日期月份和年份

mysql - 更新 Rails 关联表