问题标签 [entity-attribute-value]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
486 浏览

entity-attribute-value - 我在 EAV 中使用关系除法,但我需要在 EAV 中找到具有某些分类的结果

我有两张桌子:

为了在 EAV 中查找符合我的条件的所有订阅者,我使用了关系除法:

这为我提供了具有所有标准的唯一订阅者列表。所以这意味着我会找回订阅者 1 和 2,因为他们正在寻找红色和 xl 尺寸,而这正是我的标准。

但是如果我想扩展它以便我也得到订阅者 3,因为这个订阅者没有具体说明他们想要什么颜色或大小(即 EAV 表中没有属性“颜色”或“大小”的条目订户 3)。

鉴于我目前的设计,有没有一种方法可以扩展我的查询以包括定义了零个或多个属性的订阅者,如果他们确实定义了属性,那么它必须匹配标准?

还是有更好的方法来设计表格以帮助查询?

0 投票
1 回答
287 浏览

c# - 当数据很像 EAV 时,如何将电子商务表标准化/重构为 Pocos

在我们的电子商务应用程序中,我们有不同种类的产品,它们具有不同的属性,例如,鞋子与可食用蛋糕具有不同的销售特征。我们的电子商务网站允许您“构建”您自己的产品,选择各种属性和值(例如杯子蛋糕上的粉红色糖霜,这会增加 0.25 美元的成本)。

我们的第一个构造看起来像这样。这是一个需要维持的噩梦。 我正在寻找有关如何以更规范和现实的方式组装这些表(或对象)的建议。

我们有一个非常标准的产品表,其中包含比这更多的字段,但您明白了:

我们有一个选项表,其中列出了可以为给定选项组选择的所有选项(考虑一个下拉列表):

然后我们有一个多对多表将这两者联系在一起,其中记录的存在将选项与该产品联系起来:

我们正在尝试为相似的产品分配相似的选项,例如所有蛋糕通常具有相同的口味,所有糖霜通常具有相同的颜色等,因此当我们更改选项时,它会针对所有相关产品而更改。

任何建议都将不胜感激,尤其是在 DDD 方面。

0 投票
4 回答
2617 浏览

database-design - 如何克服从 EAV 数据库报告的缺点?

SQL 中实体-属性-值数据库设计的主要缺点似乎都与能够高效快速地查询和报告数据有关。由于这些问题以及几乎所有应用程序的查询/报告的共性,我阅读的有关该主题的大多数信息都警告不要实施 EAV。

我目前正在设计一个系统,其中一个实体的字段在设计/编译时是未知的,并且由系统的最终用户定义。EAV 似乎很适合这个要求,但由于我读到的问题,我在实施它时犹豫不决,因为这个系统也有一些非常繁重的报告要求。我我已经想出了解决这个问题的方法,但想向 SO 社区提出这个问题。

鉴于典型的规范化数据库 (OLTP) 并不总是运行报告的最佳选择,一个好的做法似乎是拥有一个“报告”数据库 (OLAP),将规范化数据库中的数据复制到该数据库中,并对其进行广泛索引,并且可能非规范化以便于查询。是否可以使用相同的想法来解决 EAV 设计的缺点?

我看到的主要缺点是将数据从 EAV 数据库传输到报告的复杂性增加,因为您可能最终不得不更改报告数据库中的表,因为在 EAV 数据库中定义了新字段。但这几乎是不可能的,而且对于 EAV 设计所赋予的更大灵活性而言,这似乎是一个可以接受的折衷方案。如果我使用非 SQL 数据存储(即 CouchDB 或类似数据)作为主要数据存储,也会存在此缺点,因为所有标准报告工具都期望 SQL 后端进行查询。

如果您有一个单独的报告数据库进行查询,EAV 系统的问题是否大部分都消失了?

编辑:感谢到目前为止的评论。关于我正在研究的系统的重要事情之一是我实际上只是在谈论将 EAV 用于其中一个实体,而不是系统中的所有内容。

该系统的整个要点是能够从多个不同的来源提取数据,这些来源事先不知道,并对数据进行处理以得出一些关于特定实体的“最知名”数据。因此,我处理的每个“字段”都是多值的,我还需要跟踪每个“字段”的历史记录。对此的规范化设计最终是每个字段 1 个表,这使得查询它无论如何都是痛苦的。

这是我正在查看的表模式和示例数据(显然与我正在研究的内容有所不同,但我认为它很好地说明了这一点):

EAV 表

报告表

标准化设计

此处的“信心”字段是使用 SQL 无法轻松表达(如果有的话)的逻辑生成的,因此除了插入新值之外,我最常见的操作是为所有字段提取有关一个人的所有数据,以便我可以生成记录报告表。这在 EAV 模型中实际上更容易,因为我可以执行单个查询。在规范化设计中,我最终不得不对每个字段进行 1 次查询,以避免大量笛卡尔积将它们连接在一起。

0 投票
3 回答
654 浏览

php - 那么我最初考虑使用 EAV 的产品属性情况是什么 RDF 数据库?

我有一个类似的问题,如如何为多种产品设计产品表,其中每种产品都有很多参数

我现在确信使用 RDF。只是因为比尔·卡尔文在回答上述问题时发表的评论之一

但我已经在 mysql 中有一个数据库,代码在 php 中。

1) 那么我应该使用什么 RDF 数据库呢?

2)我是否结合了这种方法?这意味着我在 mysql 数据库中有一个类表继承,而在 RDF 中只有奇怪的产品属性?我认为我不应该将所有内容都移到 RDF 数据库中,因为它只是产品以及给我带来问题的大量可能的属性和价值。

3) 我应该看哪些 php 资源、文章来帮助我更好地创建它?

4)在上述挑战的背景下,更多的文章或资源可以帮助我更好地理解RDF,以更好地保持各种产品的属性和价值,我们将不胜感激。当我对正在发生的事情有一个概念性的理解时,我往往会工作得更好。

请记住,我对此完全是新手,我的编程和数据库知识充其量只是平均水平。

0 投票
1 回答
3664 浏览

hibernate - 使用 Hibernate for User -> Settings 关系实现 EAV 模式

我正在尝试使用 Java/Spring MVC 和 Hibernate 在我的 Web 应用程序中设置一个简单的 EAV 模式。我似乎无法弄清楚这种情况下休眠 XML 设置背后的魔力。

我的数据库表“SETUP”有三列:

  • user_id (FK)
  • setup_item
  • 设置值

数据库组合键由user_id | setup_item

这是 Setup.java 类:

我对 Hibernate 设置的问题是,我似乎无法弄清楚如何映射一个外键和映射的键将构造表的复合键的事实......这是由于缺乏使用 Hibernate 的经验。这是我最初尝试使其工作的尝试:

任何有关如何正确映射此常见场景的见解都将不胜感激!

0 投票
1 回答
2482 浏览

database-design - 产品属性的数据库架构

和很多人一样,我正在寻找Products /Product Properties数据库模式。我正在使用 Ruby on Rails 和(Thinking)Sphinx 进行多面搜索。

要求:

  • 添加新产品类型及其选项不需要更改数据库架构
  • 支持使用 Sphinx 进行分面搜索。

我遇到的解决方案:(
比尔卡尔文的回答

选项 1:单表继承

真的不是一个选择。该表将包含许多列。

选项 2:类表继承

Ruby on Rails 在启动时缓存数据库模式,这意味着每当引入新类型的产品时都会重新启动。如果您有一个大小合适的产品目录,这可能意味着数百个表格。

选项 3:序列化 LOB

杀死能够在没有繁重的应用程序逻辑的情况下进行多面搜索。

选项 4:实体-属性-值

出于测试目的,EAV 工作正常。However it could quickly become a mess and a maintenance hell as you add more and more options (eg when an option increase the prices or delivery time).


我应该选择什么?还有哪些其他解决方案?有没有我忽略的灵丹妙药(哈)?

0 投票
4 回答
4920 浏览

database - EAV 数据库方案

我有一个超过 100K 记录的数据库。许多类别和许多项目(每个类别具有不同的属性) 一切都存储在 EAV 中。

如果我试图打破这个方案并为任何类别创建一个独特的表格,我必须避免吗?

是的,我知道我可能会有很多表,如果我想添加一个额外的字段,我需要更改它们,但是这是错误的吗?

我还读到,我有很多表,数据库将填充更多文件,这对任何文件系统都不利。

有什么建议吗?

0 投票
1 回答
1531 浏览

nhibernate - 将 NHibernate 与 EAV 数据模型一起使用

我正在尝试利用 NH 映射到对 EAV/CR 数据模型进行松散解释的数据模型。

我的大部分工作都在工作,但在映射 Entity.Attributes 集合时遇到了困难。

以下是有问题的表格:

AttributeValue 列实现为 sql_variant 列,我已经为它实现了 NHibernate.UserTypes.IUserType。

我可以创建一个 EntityAttribute 实体并直接将其持久化,以便层次结构的一部分正常工作。

我只是不确定如何将 EntityAttributes 集合映射到 Entity 实体。

请注意,对于给定的 EntityId/AttributeId 组合,EntityAttributes 表可以(并且确实)包含多行:

对于此示例,StringAttributes 行如下所示:

如何有效地将此数据模型映射到我的实体域,以便 Entity.Attributes("FavoriteColors") 返回最喜欢的颜色集合?键入为 System.String?

0 投票
3 回答
1268 浏览

php - mysql 如果存在

我有这张桌子

还有这张桌子

我想从 id_attribute=1 的 ATTRIBUTE_VALUE 中选择,如果存在(UMS.value=ATTRIBUTE_VALUE.ums),然后按 UMS.order 排序,如果按 ATTRIBUTE_VALUE.value 分组

输出示例:

0 投票
1 回答
761 浏览

mysql - 数据库EAV模型,按搜索记录列表

我正在构建一个动态应用程序。我有三张桌子:(EAV模型风格)

  1. 项目(ItemId,ItemName)
  2. 字段(FieldId、FieldName)
  3. 字段值(ItemID、FieldId、值)

你能告诉我如何编写 SINGLE 查询以从 FieldId=4 等于 TRUE 的所有项目中获取 20 条记录。

预期结果 :

重要问题:

  1. 每个项目的字段数未知
  2. 我需要一个来写一个查询。
  3. 查询将在 100K 条记录上运行,因此需要考虑性能。
  4. 我使用的是 MySQL 5.0,所以需要 MYSQL 的解决方案

如果上述查询根本不可能,我应该对表进行非规范化吗?有什么建议吗?