实体属性值数据库与严格关系模型电子商务

2024-03-12

可以肯定地说EAV/CR http://en.wikipedia.org/wiki/Entity-attribute-value_model数据库模型不好。也就是说,

问题:应该使用什么数据库模型、技术或模式来处理描述可以在运行时更改的电子商务产品的属性“类”?

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

优秀的电子商务应用程序有一个很好的共同功能,它们会显示一组产品,然后有“向下钻取”侧边菜单,您可以在其中看到“电视分辨率”作为标题,以及该应用程序的前五个最常见的电视分辨率找到设置。您单击其中一个,它只会显示该分辨率的电视,您可以通过在侧面菜单上选择其他类别来进一步深入了解。这些选项将是在运行时添加的动态产品属性。

进一步讨论:

长话短说,互联网上是否有任何链接或模型描述可以“学术地”修复以下设置?我感谢诺埃尔·肯尼迪提出类别表的建议,但需求可能不止于此。下面我以不同的方式描述它,试图强调其重要性。我可能需要修正视角来解决问题,或者我可能需要更深入地研究 EAV/CR。

喜欢 EAV/CR 模型的积极响应。我的开发同事们都说了 Jeffrey Kemp 在下面谈到的内容:“新实体必须由专业人士建模和设计”(断章取义,请阅读下面他的回复)。问题是:

  • 实体每周添加和删除属性
    (搜索关键词决定未来的属性)
  • 每周都有新实体到达
    (产品由零件组装而成)
  • 旧实体每周消失
    (已存档、不太受欢迎、季节性)

客户想要为产品添加属性有两个原因:

  • 部门/关键词搜索/同类产品对比图
  • 结账前消费产品配置

属性必须有意义,而不仅仅是关键词搜索。如果他们想比较所有具有“生奶油糖霜”的蛋糕,他们可以单击蛋糕,单击生日主题,单击生奶油糖霜,然后检查所有有趣的蛋糕,因为它们都具有生奶油糖霜。这不是特定于蛋糕,只是一个例子。


我能想到一些一般的优点和缺点,在某些情况下,其中一种比另一种更好:

选项 1,EAV 型号:

  • 优点:设计和开发简单应用程序的时间更少
  • 优点:很容易添加新实体(甚至可能 由用户添加?)
  • Pro:“通用”界面组件
  • 缺点:验证简单数据类型需要复杂的代码
  • 缺点:简单的 SQL 更复杂 报告
  • 缺点:复杂的报告几乎可以变得 不可能的
  • 缺点:大型数据集性能较差

选项 2,分别对每个实体建模:

  • 缺点:需要更多时间收集 要求和设计
  • 缺点:必须对新实体进行建模并且 由专业人士设计
  • 缺点:为每个组件自定义界面组件 实体
  • 优点:数据类型约束和验证易于实现
  • 优点:SQL 易于编写、易于实现 理解并调试
  • 优点:即使是最复杂的报告也相对简单
  • Pro:大型数据集的最佳性能

选项 3,组合(“正确”建模实体,但为某些/所有实体的自定义属性添加“扩展”)

  • 优点/缺点:收集需求和设计所需的时间比选项 1 更多,但可能不如选项 2 *
  • 缺点:新实体必须由专业人员建模和设计
  • 优点:以后可以轻松添加新属性
  • 缺点:验证简单数据类型需要复杂的代码(对于自定义属性)
  • 缺点:仍然需要自定义界面组件,但通用界面组件可能适用于自定义属性
  • 缺点:一旦报表中包含任何自定义属性,SQL 就会变得复杂
  • 缺点:总体性能良好,除非您开始需要按自定义属性进行搜索或报告

* 我不确定选项 3 是否一定会节省设计阶段的时间。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实体属性值数据库与严格关系模型电子商务 的相关文章

  • 根据表sql中的行替换字符串中的字符

    我需要用一些映射的字符替换字符串中的字符列表 我有一个表 dbo CharacterMappings 有 2 列 CharacterToFilter 和 ReplacementCharacter 假设这个表中有3条记录 Filter Rep
  • SQL Server 用分隔符分割字符串

    我有一个输入字符串 100 2 3 101 2 1 103 2 3 我想解析它并将其添加到具有 3 列的表中 因此它应该是 f x col1 col2 col3 100 2 3 类似的其他数据以逗号分隔作为记录和 作为列 Thanks ni
  • Mysql 检索所有有限制的行

    我想检索特定用户的所有行 限制为 0 x 所以我只是想问是否有任何方法可以检索 mysql 中的所有行 而不调用返回 x 的 count id 的方法 而不重载现有函数 该函数在查询中根本没有限制 与我们的 string Relace 功能
  • 如何在不运行 PostgreSQL 服务器的情况下初始化 PostgreSQL 数据库

    在初始化脚本中 我想初始化 PostgreSQL 目录 但在此阶段不需要 也不希望 正在运行的 PostgreSQL 服务器 如果我只是创建集群 作为用户postgres initdb D 但是 我还需要创建 PostgreSQL 角色 创
  • SQL 删除表并重新创建并保留数据

    在我们最初的设计中 我们搞砸了表中的外键约束 现在表已充满数据 我们无法在不删除表中所有记录的情况下更改它 我能想到的唯一解决方案是创建一个备份表并将所有记录放在那里 然后删除所有记录 更改表并开始将它们添加回来 还有其他 更好 的想法吗
  • 如何在列上创建外键,该列的每条记录都可能引用多个表之一中的列?

    我正在创建一个社交网络 它有新闻 照片等多个实体 可以有评论 由于所有评论都具有相同的列并且行为方式相同 唯一的区别是它们的类型 新闻 照片或将来添加的其他内容 我决定为所有评论创建一个表 其中的列名为type 它工作得很好 直到我决定将外
  • sql server 按组排名

    问题看似简单 但我却无法理解 这是针对 sql 服务器的 what I have in a table What I need as a output cksum id cksum id 2162514679 204 2162514679
  • 如何在 PostgreSQL 中使用具有多个值的 SQL LIKE 条件?

    有没有更短的方法来查找多个匹配项 SELECT from table WHERE column LIKE AAA OR column LIKE BBB OR column LIKE CCC 这个问题适用于 PostgreSQL 9 1 但如
  • Laravel leftJoin 仅右表的最后一条记录

    我是 Laravel 的新手 我有两张桌子 1 产品 2 价格 products id product int p key name varchar prices id price int p key id product int
  • 将第三个表链接到多对多关联中的桥接表

    设计这个数据库的正确方法是什么 这是我设置表格的方式 我在名为 教师 的表和名为 仪器 的表之间存在多对多关系 然后我有一个连接两者的桥接表 我想将另一个表与 BRIDGE 表关联起来 意思是乐器 老师的组合 该表有 3 行 指定老师可以教
  • 如何 md5 所有列(无论类型如何)

    我想创建一个 sql 查询 或 plpgsql 它将 md5 所有给定的行 无论类型如何 但是 在下面 如果 1 为空 则哈希为空 UPDATE thetable SET hash md5 accountid accounttype cre
  • SELECT 语句会受到 SQL 注入攻击吗?

    实际上有2个问题 我知道我必须尽可能多地使用存储过程 但我想知道以下内容 A 我可以从 SELECT 语句 例如 Select from MyTable 获得 SQL 注入攻击吗 B 另外 当我在 ASP NET 中使用 SQLDataSo
  • 内连接不重复,可以吗?

    鉴于这两个表 表 A1 有两行具有相同的值 a A1 a a 表 A2 有两行主键值为 A B 它们与 a 关联 A2 PK col2 A a B a 我想要的是 A1 和 A2 的连接并得到这个结果 a A a B 显然内连接在这里不起作
  • 委托给子组件的模式

    在我正在工作的产品中 非常基本的场景之一是类的序列化 通常 要序列化的类会在其子组件上调用序列化 例如如果有一个类 s t 班级 A B C D 那么A Pack会调用pack B C D 上的函数 由于有很多这样的类 因此必须一遍又一遍地
  • 为表中的每个组选择前 N 行

    我面临一个非常常见的问题 即 为表中的每个组选择前 N 行 考虑一个表id name hair colour score列 我想要一个结果集 对于每种头发颜色 都能得到前 3 名得分手的名字 为了解决这个问题 我得到了我所需要的Rick O
  • MyBatis:在一个查询中通过注释收集

    我有一个 xml 映射器 一个选择映射器和一个结果映射器 它工作没有问题 但我想使用注释 我的映射器
  • 为什么我可以像调用实例方法一样调用类方法?

    我正在查看这个例子 class SQLObject def self columns return columns if columns columns DBConnection execute2 lt lt SQL first SELEC
  • XML 解析:格式良好的检查:未声明的实体

    我正在使用 SSMS 2008 但收到以下错误 你知道这意味着什么吗 Msg 9448 Level 16 State 1 Line 4 XML parsing line 1 character 89 well formed check un
  • 如何使用 LAMBDA 表达式在 LINQ 中执行 IN 或 CONTAINS?

    我有以下 Transact Sql 我正在尝试将其转换为 LINQ 并且很挣扎 SELECT FROM Project WHERE Project ProjectId IN SELECT ProjectId FROM ProjectMemb
  • 如何获得顶部带有千位分隔符的数字?

    SELECT count FROM table A 假设结果是8689 我怎样才能将它转换为8 689在 SQL Server 上 尝试这样 select replace convert varchar convert Money coun

随机推荐