可以肯定地说,EAV/CR数据库模型是糟糕的.也就是说,

问题:What database model, technique, or pattern should be used to deal with "classes" of attributes describing e-commerce products which can be changed at run time?

在一个好的Electron 商务数据库中,您将存储选项类(比如TV分辨率,然后每个TV都有一个分辨率,但下一个产品可能不是TV,也没有"TV分辨率").如何存储它们、高效搜索并允许用户使用描述其产品的变量字段设置产品类型?如果搜索引擎发现客户通常根据控制台深度搜索电视,则可以将控制台深度添加到字段中,然后在运行时为每种电视产品类型添加一个深度.

在好的Electron 商务应用程序中有一个很好的共同特点,它们显示一组产品,然后有"向下搜索"的侧菜单,在那里你可以看到"电视分辨率"作为标题,以及找到的一组最常见的五种电视分辨率.你点击其中一个,它只显示该分辨率的电视,允许你通过 Select 侧菜单上的其他类别进一步深入.这些选项将是在运行时添加的动态产品属性.

Further discussion:

长话短说,我感谢诺埃尔·肯尼迪(Noel Kennedy)提出了一个分类表,但需要的可能不止这些.下面我用另一种方式来描述它,试图强调它的重要性.我可能需要一个观点修正来解决这个问题,或者我可能需要深入研究EAV/CR.

我喜欢EAV/CR模式的正面react .我的开发伙伴们都说Jeffrey Kemp在下面提到的话:"新实体必须由专业人士建模和设计"(脱离上下文,阅读下面他的回答).问题是:

  • entities add and remove attributes weekly
    (search keywords dictate future attributes)
  • new entities arrive weekly
    (products are assembled from parts)
  • old entities go away weekly
    (archived, less popular, seasonal)

客户希望为产品添加属性有两个原因:

  • 部门/关键字搜索/同类产品之间的比较表
  • checkout 前的消费品配置

属性必须具有重要意义,而不仅仅是关键字搜索.如果他们想比较所有有"奶油奶油霜"的蛋糕,他们可以点击蛋糕,点击生日主题,点击奶油霜,然后判断所有有趣的蛋糕,知道他们都有奶油霜.这不是蛋糕特有的,只是一个例子.

推荐答案

我能想到一些普遍的优点和缺点,在某些情况下,一个比另一个好:

Option 1, EAV Model:

  • 优点:设计和开发简单应用程序的时间更短
  • 优点:新实体易于添加(甚至可能
  • Pro:"通用"接口组件
  • 缺点:验证简单数据类型需要复杂的代码
  • 缺点:简单的SQL要复杂得多
  • 缺点:复杂的报告几乎可以变成
  • 缺点:大型数据集的性能较差

Option 2, Modelling each entity separately:

  • 缺点:收集信息需要更多时间
  • 反对意见:新实体必须建模并
  • Con:每个组件的自定义接口组件
  • 优点:数据类型约束和验证易于实现
  • 优点:SQL很容易编写,也很容易使用
  • 赞成:即使是最复杂的报告也相对简单
  • 优点:适用于大型数据集的最佳性能

Option 3, Combination (model entities "properly", but add "extensions" for custom attributes for some/all entities)

  • 赞成/反对:收集需求和设计所需的时间比选项1多,但可能不如选项2多*
  • 缺点:新实体必须由专业人士建模和设计
  • 优点:以后可能很容易添加新属性
  • 缺点:验证简单数据类型需要复杂的代码 (for the custom attributes)
  • 缺点:仍然需要自定义接口组件,但是对于自定义属性,通用接口组件可能是可能的
  • 缺点:只要报表中包含任何自定义属性,SQL就会变得复杂
  • 缺点:通常性能良好,除非您开始需要按自定义属性进行搜索或报告

* I'm not sure if Option 3 would necessarily save any time in the design phase.

我个人倾向于 Select 2,尽可能避免EAV.然而,对于某些场景,用户需要EAV带来的灵活性;但这需要付出巨大的代价.

Sql相关问答推荐

PostgreSQL集群不间断的数据系列

具有2个共享列的两个表的Amazon RSQL合并

在postgres中动态计算出现次数并插入到json中

有没有办法用SQL编写一条CASE语句,如果列A&>0,那么列B,列C=0

对非RUST源代码字符串使用`stringify!`,例如SQL查询

PostgreSQL:按小时查看调整日期

导出部分条形码字符串GS1-128

正在编写查询.我需要将订阅的时间段分为第一个订阅中包含的另一个订阅之前和之后的时间段

使用多个嵌套数组查询JSON数据

如何将insert语句重复n次使一个值递增?

当active=1时,是否可以创建id为的唯一索引?

将 jsonb 数组中的对象取消嵌套到单独的行中

Postgresql 生成器列导致语法错误

根据要过滤的列的值进行联接和分组

SQL 中的第一个值和倒数第二个值

如何从postgresql中的项目映射(关联数组)设置值?

有没有办法在雅典娜中将字符串转换为 int ?

如何在插入时将字符串'03-January-2023'转换为日期时间

SELECT 用于 Parent、Children 和 ORDER BY [Order] 列

如何在 RavenDB Studio (RQL) 中插入更新文档