Database design 稀疏属性建模的最佳模式
我在一个金融服务产品上工作,该产品存储了大量有关最终客户的信息。我们的客户不断地想要添加新的属性,这些属性通常不用于驱动我们产品中的任何流程。他们被捕获和展示,但没有其他。由于客户运营方式的不同,他们通常希望存储非常不同的值。我们尝试了两种解决方案来适应他们:Database design 稀疏属性建模的最佳模式,database-design,Database Design,我在一个金融服务产品上工作,该产品存储了大量有关最终客户的信息。我们的客户不断地想要添加新的属性,这些属性通常不用于驱动我们产品中的任何流程。他们被捕获和展示,但没有其他。由于客户运营方式的不同,他们通常希望存储非常不同的值。我们尝试了两种解决方案来适应他们: 有100个100列的稀疏填充表 实体属性值表,其中客户可以根据需要定义新列 我们经历了两种解决方案的大部分缺点。很多专栏让我们感到安慰,因为我们知道我们正在向数据库中添加哪些数据,但当客户“只是”想要存储新的价值时,比如最喜欢的高尔夫俱乐
有没有更好的模式呢?我想我不能给你指出一个特定的模式,但你可能听说过 它是一个数据库,用于解决在开发数据库密集型应用程序过程中经常出现的各种问题(例如,可以用CoffeeScript编写脚本,您可以通过JSON访问数据)
他们提供了一个名为的扩展,听起来它可以消除您的所有问题。HSTORE基本上允许您在表中存储任意散列数据。甚至可以查询它。我将其建模为一个单独的属性表,而不是一个包含多个“自定义”列的表。。。当您有100列并且它们想要添加属性#101时会发生什么?那么很少有自定义属性的客户机呢?一百列
NULL
列
在这种情况下,您的存储类型可以是VARCHAR(MAX)
,因为除了选择并显示它们之外,您对这些列不执行任何逻辑。结果是INT
或DATE
类型(或您可能希望存储的任何不同类型)的存储可能效率低下,但这就是允许客户端在这些自定义字段中存储任何内容的本质
考虑一个有五列的表:
- 身份证
- 父类型
- 父ID
- CustomValueName
- 顾客价值
因此,现在您有足够的信息:
明确地将自定义属性绑定到数据库中的任何其他实体
如果需要,为自定义聚合命名属性类型
附加用户想要的任何值
缺点是对这些自定义属性进行查询有些痛苦(虽然在SQL中可以轻松完成,但查询计划不会非常有效)。我在上做了一个关于这个主题的演示。我的演讲被叫来了
对于您的情况,由于用户定义的属性不在SQL查询中使用(仅按照您所说的捕获和显示),因此我建议使用这种模式
这是我演讲的摘要。幻灯片免费提供:
设计一个可扩展的、灵活的模式来支持用户
定制是一个常见的需求,但很容易自己绘制
陷入一个角落
可扩展数据库要求的示例:
- 允许用户根据需要声明新字段的数据库李>
- 或者是包含许多产品的电子商务目录,每个产品都有不同的属性李>
- 或支持自定义数据扩展的内容管理平台李>
我们用于满足这些需求的解决方案过于复杂和复杂
表演糟透了。我们应该如何找到正确的平衡
在模式和无模式数据库设计之间
我将简要介绍实体属性值(EAV)的缺点,
一个有问题的设计,这是一个反模式的例子,称为
内部平台效应,即对属性管理进行建模
系统位于RDBMS体系结构之上,该体系结构已经提供
通过列、数据类型和约束的属性
然后我们将讨论替代数据建模的优缺点
模式,在开发人员生产力、数据完整性方面,
存储效率和查询性能,以及易于扩展性
- 类表继承
- 序列化BLOB
- 反向索引
最后,我们将展示pt online schema change和新特性等工具
MySQL 5.6的一部分,它消除了模式修改的痛苦
我不明白您所说的实体属性值表
是什么意思。我很想帮助你,你有没有想过尝试XML?@Tauseef请看这里:那么我们的观点是一致的。谢谢思考声音就像NoSQL的工作一样。LOB推荐+1。值得一提的是,如果您确实想查询此数据,那么使用这种LOB格式是相当痛苦的。EAV方法也很痛苦,但比LOB更容易访问。@Matthew,请查看我的演示文稿中的反向索引解决方案。它帮助LOB解决方案更易于查询。只要阅读它,它就相当聪明了。我想知道处理LOB和反向索引是否会导致原子性和隔离性问题?即使是这样,失败的后果似乎很低。@Matthew,如果在单个事务中更新LOB和反向索引,那么在原子性和隔离性方面应该不会有任何问题。但我承认,更新多个表是一件麻烦事。这就是在关系数据库中存储非关系数据的成本。非常好的选项和优缺点的演示和总结,谢谢!