动态数据库架构

70

为支持动态逻辑数据库模式,推荐使用什么样的存储架构?

具体而言,如果系统需要为其用户在生产过程中可能扩展或更改的模型提供存储,则有哪些良好的技术、数据库模型或存储引擎可用?

以下是几个可能的方案:

  • 通过动态生成的DML创建/修改数据库对象
  • 创建具有大量稀疏物理列并仅使用覆盖逻辑模式所需列的表
  • 创建“长而窄”的表格,将动态列值作为行存储,然后需要对其进行旋转以创建包含特定实体所有值的“短而宽”的行集
  • 使用BigTable/SimpleDB PropertyBag类型系统

非常感谢基于真实世界经验的任何答案。

16个回答

2

我认为EAV方法是最好的方法,但代价却很高。


这是在Magento中完成的。查询很重且缓慢,但它非常灵活。 - Alan

1
在c2.com维基上,探讨了"动态关系"的概念。您不需要DBA:列和表是创建时写入的,除非您开始添加约束以使其更像传统的RDBMS:随着项目成熟,您可以逐步“锁定”它。
从概念上讲,您可以将每一行视为XML语句。例如,员工记录可以表示为:
<employee lastname="Li" firstname="Joe" salary="120000" id="318"/>

这并不意味着它必须被实现为XML,它只是一个方便的概念化。如果您请求一个不存在的列,比如"SELECT madeUpColumn ...",它会被视为空白或null(除非添加约束禁止这样做)。而且可以使用SQL,尽管由于暗示的类型模型,必须小心比较。但除了类型处理之外,动态关系系统的用户会感到像在家一样,因为他们可以利用大部分现有的RDBMS知识。现在,如果有人能够构建它就好了...


0
过去我选择了选项C - 创建一个“长而窄”的表,将动态列值存储为行,然后需要将其旋转以创建包含特定实体所有值的“短而宽”的行集。 但是,我使用的是ORM,这真的让事情变得痛苦。我想不出你如何在LinqToSql中做到这一点。我想我必须创建一个哈希表来引用字段。

@Skliwz:我猜他更感兴趣的是允许用户创建用户定义的字段。


0

我知道这是一篇非常老的帖子,过去的11年间发生了很多变化,但我想添加一些内容,因为它可能对未来的读者有所帮助。我和我的联合创始人创建HarperDB的原因之一是在单个、不重复的数据集中本地实现动态模式,并提供完整的索引功能。你可以在这里阅读更多信息:
https://harperdb.io/blog/dynamic-schema-the-harperdb-way/


0

ElasticSearch。如果你正在处理可以按日期分区的数据集,可以使用JSON格式的数据,并且不固定于使用SQL检索数据,则应特别考虑它。

ES会为您发送的任何新JSON字段推断其模式,可以自动、带提示或手动定义/更改,只需一个HTTP命令(“映射”)即可。 虽然它不支持SQL,但具有一些出色的查找功能和聚合功能。


-5

SQL 已经提供了一种更改模式的方式:ALTER 命令。

只需拥有一张列出用户不允许更改的字段的表格,并编写一个漂亮的 ALTER 接口即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接