问题标签 [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.
sql - 实体属性值数据库与严格的关系模型电子商务
可以肯定地说EAV/CR数据库模型很糟糕。也就是说,
问题:应该使用什么数据库模型、技术或模式来处理描述电子商务产品的属性“类”,这些属性可以在运行时更改?
在一个好的电子商务数据库中,您将存储选项类别(例如电视分辨率,然后为每台电视提供一个分辨率,但下一个产品可能不是电视,也没有“电视分辨率”)。您如何存储它们、有效搜索并允许您的用户使用描述其产品的可变字段设置产品类型?如果搜索引擎发现客户通常根据控制台深度搜索电视,您可以将控制台深度添加到您的字段中,然后在运行时为每个电视产品类型添加单个深度。
优秀的电子商务应用程序有一个很好的共同特征,它们显示一组产品,然后有“向下钻取”侧菜单,您可以在其中看到“电视分辨率”作为标题,以及最常见的前五个电视分辨率发现集。您单击一个,它只显示该分辨率的电视,允许您通过选择侧面菜单上的其他类别进一步深入研究。这些选项将是在运行时添加的动态产品属性。
进一步讨论:
长话短说,互联网上是否有任何链接或模型描述可以“从学术上”解决以下设置? 我感谢 Noel Kennedy 提出了一个类别表,但需求可能不止于此。我在下面用不同的方式描述它,试图突出它的重要性。我可能需要进行视点校正来解决问题,或者我可能需要更深入地了解 EAV/CR。
喜欢对 EAV/CR 模型的积极响应。我的开发人员同事都说 Jeffrey Kemp 在下面谈到的内容:“新实体必须由专业人士建模和设计”(断章取意,请阅读下面的回复)。问题是:
- 实体每周添加和删除属性
(搜索关键字决定未来的属性) - 每周都有新实体到货
(产品由零件组装而成) - 旧实体每周消失
(存档、不太受欢迎、季节性)
客户想要为产品添加属性有两个原因:
- 部门/关键词搜索/同类产品对比图
- 结账前的消费产品配置
属性必须有意义,而不仅仅是关键字搜索。如果他们想比较所有有“奶油糖霜”的蛋糕,他们可以点击蛋糕,点击生日主题,点击奶油糖霜,然后检查所有有趣的蛋糕,知道它们都有奶油糖霜。这不是特定于蛋糕的,只是一个例子。
sql - 您如何为实体的自定义属性建模?
假设我们有一个应该能够存储各种产品的应用程序。每个产品至少有一个ID
和一个Name
,但所有其他属性都可以由用户自己定义。
- 例如,他可以创建一个产品组Ipods,其中包含属性容量和代
- 例如,他可以创建具有属性size和color的产品组 TShirts
- 我们需要存储产品的定义和具体产品本身。
- 我们希望确保可以轻松地按产品属性进行聚合 (GROUP BY)。例如选择每一代ipods的总容量
- 该解决方案不得要求架构更改(由于 Bill Karwin 的输入而增加了要求 - 也请参阅他的答案!)
您将如何根据上述要求为您的模式建模?
注意:要求 4. 很重要!
感谢大家贡献和讨论该方法。过去我已经看到了一些解决这个问题的方法,但没有一个让我对分组变得容易:(
asp.net - 将数据从名称值对表中获取到 DataSet 的高效 SQL 过程?
使用 SQL Server,有一个名称值对表。每一行基本上都是userid,contentid,sectionid,parameter,value。所以有我想在表格中显示的数据,例如用户信息。每一点信息都在它自己的行中,那么我如何将它放入 DataSet 以在中继器中使用?我可以以某种方式将行合并为一个吗?所以我可以在一行上获得多个参数/值对?
像……
用户 32 的两行:
显示在中继器的一行中,如下所示:
有任何想法吗?哦,是的,它采用名称/值对格式的原因是为了遵守所需的标准。
c# - SQL中的“动态”表?
我目前正在为一个网站的想法弄乱一些东西 - 我非常想让我的用户创建保存数据的“表”,然后允许他们查询这些数据(以一种比写起来更令人讨厌的方式SQL 查询,希望比使用 excel 更容易)。
到目前为止,我的想法是在我的数据库中使用几个表来表示这一点 - 一个表表示一个表,一个表表示表的列,一个表表示表中的每一行,最后一个表表示值. 类似于(伪 SQL)的东西:
(请注意,TableValues 表在这里有 2 个主键字段,它应该代表一个“复合”主键,不要太在意我的语法不是合法的 SQL,它只是应该显示这个想法)。
我对此进行了一些测试,并能够成功地进行简单的查询(简单的过滤、排序等)。我这样做的方法是首先查询 TableRows 表 - 为了进行过滤,我然后过滤掉了列与条件不匹配的行,并且为了排序,我根据列的内容对 RowIds 进行了排序(由指定的排序指定)。生成按所需顺序排列的行 ID 列表,从这里开始只是选择需要的内容。
所有这一切都很好,但从这里开始我有点卡住了。我希望能够以某种方式表示不同的数据类型(这确实是我的主要问题),然后再研究如何进行连接。
在考虑所有这些时,我开始怀疑是否有更好的方法来做到这一点。请注意,这里的性能当然是一个因素,但我不打算支持具有数十万行的虚拟表,每个虚拟表可能大约 1000 行 - 当然整个系统需要能够处理许多这些。
我知道我总是可以在我的数据库中实际创建表,并在 C# 中动态创建查询来完成此操作,同样使用 SQL 查询进行查询 - 但是我从来都不喜欢让用户对我的数据库“构建”查询像这样 - 在我看来,这似乎会导致出现许多错误的路径 - 在最坏的情况下最终允许用户以一种或另一种方式杀死数据库。
此外,我的问题变成了如何以从 C# 角度来看有意义的方式来处理这个问题。到目前为止,我认为我倾向于使用 LINQ,然后创建自己的扩展方法来应用所需的功能——即扩展 IQueryable 的 ExtensionMethods。
所以我真正想要的是一些关于如何做到这一点的想法,关于如何调整性能的想法,关于如何处理表中单独数据类型的想法(当然将类型存储在 tablecolumn 中,但是如何实际存储该值,以便我可以按它过滤、排序等?- 不只是在我的 tablevalues 表上添加“TextValue”、“MoneyValue”等列)。最后但并非最不重要的一点是,希望在这里进行一些很好的讨论——我至少认为这是一个有趣的话题。
sql-server - 您将如何设计数据库以允许用户定义模式
如果您必须创建一个应用程序,比如博客应用程序,那么创建数据库模式相对简单。您必须创建一些表格、tblPosts、tblAttachments、tblCommets、tblBlaBla……就是这样(好吧,我知道,这有点简化,但您明白我的意思)。
如果您有一个应用程序,您希望允许用户在运行时定义部分模式,该怎么办。假设您要构建一个应用程序,用户可以在其中记录任何类型的数据。一个用户想要记录他的工作时间(开始时间、结束时间、项目 ID、描述),下一个想要收集烹饪食谱,其他人可能是股票报价、他们的婴儿每周的体重、他们每月花费的食物费用、他们的结果最喜欢的足球队或任何你能想到的东西。
你将如何设计一个数据库来保存所有非常不同类型的数据?你会创建一个可以保存所有类型数据的通用模式,你会创建反映用户数据模式的新表,还是你有另一个好主意来做到这一点?
如果它很重要:我必须使用 SQL Server / Entity Framework
php - Magento API 上传的产品没有出现在前端 - 除非它们被重新保存在后端
我正在通过 Magento API 上传产品,但它们没有出现在前端。我必须进入后端,打开它们,什么都不做,保存产品,然后它就会出现。
知道为什么吗?我假设将它保存在后端的行为是在数据库中保存一些额外的标志,我只是不知道是什么。
@史蒂夫马德森。这是代码,我认为我没有遗漏任何重要的东西,因为后端界面会提示我,然后我打开产品。
database-design - 如何在列上存储元数据
假设您正在收集有关即将上映的超级英雄电影的内幕信息,并且您的主电影表如下所示:
表格1
一般来说,这应该工作得很好,并且允许非常简单的查询以及行之间的比较。
但是,您想跟踪每个数据事实的来源,以及发现该事实的记者的姓名。这似乎暗示了某种像这样的EAV表:
表 2
虽然它很容易捕获我们想要的元数据,但它使查询变得更加困难。简单地获取一部电影的所有基本数据需要更多的时间。更具体地说,您必须在此处处理四行才能获得有关绿灯侠的四个重要信息,而在表 1 中它是一个单独的、很好封装的行。
所以我的问题是,鉴于我刚刚描述的复杂性,并且因为我知道通常要避免使用 EAV 表,EAV 仍然是最好的解决方案吗?它似乎是表示这些数据的唯一合理方式。我看到的唯一另一种选择是将表 1 与另一个仅包含如下元数据的表结合使用:
表3
但这是非常危险的,因为如果有人将表 1 中的列名更改为“Villain”为“Primary Villain”,那么表 3 中的行仍然会简单地说“Villain”,因此相关数据将不幸解耦。如果“属性”列链接到另一个用作表 1 列枚举的表,这可能会有所帮助。当然,DBA 将负责维护此枚举表以匹配表 1 的实际列。并且实际上,通过使用 SQL Server 中包含表 1 中列名称的系统视图,而不是手动创建枚举表,实际上可能会进一步改进这一点。虽然我不确定你是否可以拥有涉及系统视图。
你有什么建议?EAV是唯一的出路吗?
如果它只有一个元数据列(只有“来源”,没有“记者”)——是否仍然需要走 EAV 路线?你可以有“Director”、“Director_Source”、“Leading Male”、“Leading Male_Source”等列,但这很快就会变得丑陋。有没有更好的解决方案我没有想到?
如果我没有澄清任何观点,请发表评论,我会根据需要添加更多内容。哦,是的,我使用的电影数据是捏造的:)
编辑:为了简明扼要地重申我的主要问题,我希望表 1 具有简单性和真正的 RDBMS 设计,它确实很好地描述了电影条目,同时仍以安全且可访问的方式存储属性上的元数据。这可能吗?还是 EAV 是唯一的方法?
编辑 2:在做了更多的网络研究之后,我还没有找到关于 EAV 的讨论,该讨论围绕着在列上存储元数据的愿望。实现 EAV 的主要原因几乎总是动态且不可预测的列,而在我的示例中并非如此。在我的例子中,总是有相同的四列:导演、男主角、女主角、反派。但是,我想为每一行存储关于每一列的某些事实(来源和记者)。EAV 会促进这一点,但我想避免诉诸于此。
更新
使用表 2 设计,除了将列“Movie”重命名为“Name”并将整个表称为“Movie”之外,这是 SQL Server 2008 中用于取回表 1 的数据透视操作:
c# - 您将如何编写类似于“工厂”设计模式的存储库模式?
我想我会重写这个问题(相同的迭代)。最初是如何围绕 EAV/CR 数据库包装存储库模式。我正在尝试一种不同的方法。
问题:您如何以“工厂”设计模式的方式编写数据存储库? 我有固定数量的实体,但这些实体的属性是相当客户特定的。他们宣传的产品都相似,但每个客户根据他们的商业模式附加不同的信息。例如,有些人关心浪费的百分比,而另一些人关心所售出的磅数。每次我们找到另一个客户时,我们都会添加一堆字段,删除一堆字段,然后花费数小时将每个解决方案与最新的通用版本保持同步。
我认为我们可以将存储库类放在工厂模式中,这样当我知道客户类型时,我就知道他们将使用哪些字段。实际的?更好的方法?Web 表单使用经过修改以反映布局上的字段的用户控件。我们目前将布局上的字段“连接”到产品表中的字段,然后是 CRUD 通用字段。
上一题内容:
我们有一个 EAV/CR 数据模型,它允许同一实体使用不同的类。这会跟踪客户拥有截然不同的产品的产品。客户可以定义产品的“类”,用字段加载它,然后用数据填充它。例如,
Product.Text_Fields.Name
Product.Text_Fields.VitaminEContent
关于如何围绕此包装存储库模式的任何建议?
我们有一个三表 EAV:一个产品表、一个值表和一个列出字段名称和数据类型的元表(我们列出数据类型是因为我们还有其他表,例如 Product.Price 和 Product.Price 元数据)与其他产品,如 Product.Photo。)客户跟踪各种价格,如竞争对手的百分比折扣差异以及即时计算。
我们目前在 C# 中使用 Linq to SQL。
编辑:
我喜欢下面的“动态查询”Linq。我们的数据库背后的想法就像更衣室更衣室存储。每个运动员(或客户)按照他们希望的方式组织他们自己的储物柜,我们会为他们处理存储。我们不在乎储物柜里有什么,只要他们能用它做他们需要的事情。
非常有趣...传递给存储库的对象可能是动态的?这几乎是有道理的,几乎就像工厂模式。客户是否可以将他们自己的类定义放在一个文本文件中,然后我们继承它们并将它们存储在数据库中?
sql - EAV 解决方案/包/供应商?
我最近接触了实体属性值数据库模型的概念。Magento电子商务系统。Varien(Magento 背后的公司)使用关系数据库 (mysql) 创建了一个使用 PHP 对象的 EAV 样式模型。
我很好奇是否有“本地”EAV 数据库解决方案。“最近出现在堆栈溢出 CouchDB 上”似乎适合这个模型。这是一个正确的假设,还是 CouchDB 是别的东西?在野外我还能在哪里找到 EAV?
关系之于 MySQL 就像 EAV 之于 _______?
nhibernate - nhibernate/orm 可以支持 eav 吗?
我最近继承了一个严重依赖 EAV 数据库结构的系统,并且从性能角度来看确实很挣扎。
我想要做的是使用 nhibernate 或其他合适的 ORM 产品将这些 EAV 表映射到实体,以便我们可以将行映射到属性。然后我们可以重构数据库以使其具有关系。有谁知道这是否可能?一个例子也将不胜感激!:)
为了让您了解结构,它看起来像这样:
实体 (EntityId) EntityVarchar (EntityId, VarcharValue) EntityFloat (EntityId, VarcharValue)
等等。如果我有一个客户实体,我想说 Customer.Name 来获取名称,而不是 Customer.Varchar["Name"]。
请注意,我们的系统不需要使用 EAV 模型,我们不允许对数据结构进行运行时更改,而且我认为无论如何这是一个不好的做法。