Database design 稀疏属性建模的最佳模式

Database design 稀疏属性建模的最佳模式,database-design,Database Design,我在一个金融服务产品上工作,该产品存储了大量有关最终客户的信息。我们的客户不断地想要添加新的属性,这些属性通常不用于驱动我们产品中的任何流程。他们被捕获和展示,但没有其他。由于客户运营方式的不同,他们通常希望存储非常不同的值。我们尝试了两种解决方案来适应他们: 有100个100列的稀疏填充表 实体属性值表,其中客户可以根据需要定义新列 我们经历了两种解决方案的大部分缺点。很多专栏让我们感到安慰,因为我们知道我们正在向数据库中添加哪些数据,但当客户“只是”想要存储新的价值时,比如最喜欢的高尔夫俱乐

我在一个金融服务产品上工作,该产品存储了大量有关最终客户的信息。我们的客户不断地想要添加新的属性,这些属性通常不用于驱动我们产品中的任何流程。他们被捕获和展示,但没有其他。由于客户运营方式的不同,他们通常希望存储非常不同的值。我们尝试了两种解决方案来适应他们:

  • 有100个100列的稀疏填充表
  • 实体属性值表,其中客户可以根据需要定义新列
  • 我们经历了两种解决方案的大部分缺点。很多专栏让我们感到安慰,因为我们知道我们正在向数据库中添加哪些数据,但当客户“只是”想要存储新的价值时,比如最喜欢的高尔夫俱乐部,这会让我们显得僵硬和昂贵。EAV已经展示了它的所有常见问题:查询性能差、数据失控、缺乏验证和可维护性问题


    有没有更好的模式呢?

    我想我不能给你指出一个特定的模式,但你可能听说过

    它是一个数据库,用于解决在开发数据库密集型应用程序过程中经常出现的各种问题(例如,可以用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和反向索引,那么在原子性和隔离性方面应该不会有任何问题。但我承认,更新多个表是一件麻烦事。这就是在关系数据库中存储非关系数据的成本。非常好的选项和优缺点的演示和总结,谢谢!