我希望能够保存属性的值而不保存它的父实体.我已经通过我的模块的sql/setup文件(ref)创建了一个新的customer属性,现在我想为每个现有客户填充该属性.我为该属性创建了一个后端模型,该模型在实体加载(afterLoad)期间检测空值并生成内容,但我对在此过程中保存实体犹豫不决.
class Aligent_Referral_Model_Customer_Attribute_Backend_Referralcode extends Mage_Eav_Model_Entity_Attribute_Backend_Abstract
{
public function afterLoad($oCustomer)
{
$vAttrCode = $this->getAttribute()->getAttributeCode();
$vValue = $oCustomer->getData($vAttrCode);
if (empty($vValue)){
$oCustomer->setData($vAttrCode, Mage::helper('referral')->generateRafCode($oCustomer));
}
return $this;
}
}
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想调用类似于$this->getAttribute()->setValue('blah')->save()该afterLoad方法的内容,以便它不依赖于用户单击"保存".
我可以编写一个脚本来加载所有客户的集合并引导它们设置值,但是有超过50,000个客户,我担心在生产服务器上运行它会对性能产生影响......
任何想法都赞赏.
JD
我已经在网上做了一些搜索,但我还没有找到任何答案.我有一种情况,我需要一个十进制值的产品属性,它必须支持负数和正数,也必须是可排序的.出于某种原因,Magento没有"十进制"属性类型.使用十进制值的唯一类型是Price,但不支持负数.如果我使用"text"作为类型,它支持我想要的任何东西,但它没有正确排序,因为它将值视为字符串而不是浮点数.通过手动编辑eav_attribute表并将'frontend_input'从'price'更改为'text',但将'backend_type'保留为'decimal',我能够解决这个问题,正如其他人在我发现的帖子中所做的那样.这很有效......直到有人在管理面板中编辑该属性.保存属性后,Magento会注意到frontend_input是'text'并将'backend_type'更改为'varchar'.我能想到的唯一方法就是创建一个自定义属性类型,但我不知道从哪里开始,我在网上找不到任何细节.
还有其他人遇到过这个问题吗?如果是这样,你做了什么来纠正它?如果我需要创建一个自定义属性类型,你有任何提示,或者你能指点我在那里做任何教程吗?
谢谢!
在rails上使用ruby,我有一个Customer表,我希望能够添加无限属性(键值对).我不确定键/值对将是什么,所以我不知道如何做到这一点.例如,一个客户可能是:
基本上,客户可以在键/值对中拥有任意数量的属性.
我怎样才能做到这一点?
使用FOR JSON AUTO或FOR JSON PATH在以下记录集上(表示产品的属性):
attribute | value
-----------------
color | red
size | small
Run Code Online (Sandbox Code Playgroud)
将产生:
[{"attribute":"color","value":"red"},{"attribute":"size","value":"small"}]
Run Code Online (Sandbox Code Playgroud)
有没有办法生产以下产品:
{"color":"red","size":"small"}
Run Code Online (Sandbox Code Playgroud)
请注意,因为每个产品属性都不同于其他属性; 因此,每个产品的记录集都不同.PIVOTing不是一个选项,因为它需要动态的SQL!似乎我们需要一个能够CROSS与产品表一起生成的功能,例如产品目录.
sql-server json user-defined-functions entity-attribute-value
SQL中的Entity-Attribute-Value数据库设计的主要缺点似乎都与能够高效,快速地查询和报告数据有关.我读到的关于该主题的大部分信息都警告不要因为这些问题而实施EAV以及几乎所有应用程序的查询/报告的共性.
我目前正在设计一个系统,其中一个实体的字段在设计/编译时是未知的,并由系统的最终用户定义.EAV似乎非常适合这个要求,但由于我所读到的问题,我对实施它犹豫不决,因为这个系统也有一些非常繁重的报告要求.我想我已经找到了解决这个问题的方法,但是想向SO社区提出这个问题.
鉴于典型的规范化数据库(OLTP)仍然不总是运行报告的最佳选择,一个好的做法似乎是拥有一个"报告"数据库(OLAP),其中来自规范化数据库的数据被复制到,广泛索引,以及可能非规范化以便于查询.是否可以使用相同的想法来解决EAV设计的缺点?
我看到的主要缺点是将数据从EAV数据库传输到报告的复杂性增加,因为您可能最终必须在EAV数据库中定义新字段时更改报告数据库中的表.但这几乎是不可能的,并且似乎是EAV设计提高灵活性的可接受的权衡.如果我使用非SQL数据存储(即CouchDB或类似的)用于主数据存储,这种缺点也存在,因为所有标准报告工具都期望SQL后端进行查询.
如果您有一个单独的报告数据库用于查询,那么EAV系统的问题是否会消失?
编辑:感谢您的评论到目前为止.我正在研究的系统的一个重要事项是,我真的只是在谈论为其中一个实体使用EAV,而不是系统中的所有实体.
系统的全部要点是能够从多个不同的源提取数据,这些数据是提前未知的,并且会对数据进行处理以获得关于特定实体的一些"最知名"数据.因此,我正在处理的每个"领域"都是多值的,我还需要跟踪每个领域的历史记录.对于这种情况的标准化设计最终是每个字段1个表格,这使得查询它无论如何都很痛苦.
以下是我正在查看的表格模式和示例数据(显然与我正在处理的内容有所不同,但我认为它很好地说明了这一点):
EAV表
Person
-------------------
- Id - Name -
-------------------
- 123 - Joe Smith -
-------------------
Person_Value
-------------------------------------------------------------------
- PersonId - Source - Field - Value - EffectiveDate -
-------------------------------------------------------------------
- 123 - CIA - HomeAddress - 123 Cherry Ln - 2010-03-26 -
- 123 - DMV - HomeAddress - 561 Stoney Rd - 2010-02-15 -
- 123 - FBI - HomeAddress - 676 Lancas Dr - 2010-03-01 -
------------------------------------------------------------------- …Run Code Online (Sandbox Code Playgroud) architecture database-design system-design entity-attribute-value
我正在尝试使用脚本为magento中的属性选项添加新值以加快进程,因为我有超过2,000个制造商
我有一堆产品,每种产品都有许多不同的可能属性.例如,产品A具有名称,大小,颜色,形状.产品B有名称,卡路里,糖等.解决这个问题的一种方法是:
1)创建表
Products (id, name)
Attributes (id, name)
Product_Attributes (product_id, attribute_id, value as string)
Run Code Online (Sandbox Code Playgroud)
这允许最大的灵活性,但我听到很多人建议反对这个,虽然我不知道为什么.我的意思是,如果这些表被称为团队,玩家,Team_Players,我们都同意这是适当的关系设计.
每个向我解释为什么这么糟糕的人都会在一个完全灵活的关系设计的环境中这样做,你不会创建真正的表通过基本的几个基本初始表(例如object,attribute,object_attribute) - 我认为我们所有人都同意是坏事.但这是一个更加有限和包含的版本(只有产品,而不是系统中的每个对象),所以我认为将这两种架构组合在一起并不公平.
您遇到的哪些问题(经验或理论上的问题)使这个设计如此糟糕?
2)解决这个问题的另一种方法是创建一个Product表,其中包含一些列,如Size,Color,Shape,Weight,Sugar等,然后在末尾包含一些额外的列,以便为我们提供一些灵活性.这将创建通常稀疏的行,主要填充NULL.人们倾向于喜欢这种方法,但我的问题是,在此方法失去性能优势之前,您可以拥有多少列?如果你有200列,我想这不再是一个聪明的举动,但100列呢?50列?25列?
3)我所知道的最后一种方法是将所有属性作为blob(可能是JSON)存储在Products表的单个列中.我喜欢这种方法,但感觉不对.查询很难.如果您希望以后能够轻松更改属性的名称,则必须单独解析每个记录,或者通过某个ID将它们键入blob中.如果你去id路径然后你将需要另一个表属性,事情开始看起来像上面的方法#1,除了你将无法将你的blob加入attribute_id,所以我希望你不想查询任何东西按属性名称.
我喜欢这种方法的是你可以查询一个产品,在你的代码中你可以快速地访问它拥有的所有属性.如果删除产品,则无需清理其他表 - 易于保持一致.
4)我已经阅读了一些关于能够在某些RDBMS中索引强类型xml格式的东西,但老实说我对这种方法知之甚少.
我被卡住了.我认为方法#1是最好的选择,但我读到的所有内容都说这样的方式很糟糕.考虑这个问题的正确方法是什么,以便能够确定给定情况的最佳方法是什么?明显欢迎比我列出的更多的想法!
sql relational-database database-agnostic entity-attribute-value
我有一个Mage_Customer_Model_Customer的对象并运行以下代码:
$customer->loadByEmail($customer->getEmail());
$customer->getGender(); //returns the EAV attribute option_id's of 1 or 2
Run Code Online (Sandbox Code Playgroud)
我想获取那些option_id的eav_attribute_option_value.value,即"男性"或"女性"这个词
我不知道如何做到这一点并花了相当多的时间调试帐户表单选择小部件没有成功.我也很好奇你是怎么想出来的.
提前致谢
真诚的,累了的开发
我正在构建一个Web应用程序,它严重依赖于EAV模式来存储数据.这基本上意味着对象的每个属性在海量数据库表中都有自己的行.我正在使用MySQL存储所有内容.这是我存储的一个非常简单的例子......
OBJECTS ATTRIBUTES
objId | type objId | attribute | value
============= =========================
1 | fruit 1 | color | green
2 | fruit 1 | shape | round
3 | book 2 | color | red
Run Code Online (Sandbox Code Playgroud)
我知道有些人讨厌EAV,但我需要能够在不修改数据库模式的情况下随意添加新的对象属性,到目前为止它对我来说非常有用.
正如我想其他人在使用EAV数据结构构建系统时发现的那样,这种方法的缺点是将多个对象与每个对象的属性一起检索.目前我的应用程序一次只显示10个对象,所以我只查询我的EAV表10次(每个对象一次),它仍然非常快.但是,我想删除此限制并允许一次获取数百个对象.我还希望能够以比我目前更灵活的方式查询对象.
使用SQL连接执行此操作将是可怕的,因此我正在考虑缓存数据.平均而言,数据库每写1次就会获得大约300次读取,所以我认为这是缓存的一个很好的候选者.
到目前为止,这些是我提出的选择......
XML数据库列:每次执行写入时,都会更新包含所有对象属性的对象表中的XML文本列.这可以快速读取数据,但是查询隐藏在数据库表中的XML数据很麻烦.
XML文件:每次执行写入操作时,都会将XML文件写入磁盘,其中包含每个对象及其属性.这样做的好处是我可以使用XQuery来查询对象.
NoSQL(例如MongoDB):也许我应该在像MongoDB这样的无模式数据库上构建系统.重写整个应用程序以使用MongoDB会非常耗时,但令我震惊的是我可以将它用作缓存.因此,例如,每次将数据写入EAV存储时,等效对象将在MongoDB中更新,然后将其用于读取和查询.
最初我认为XML文件是最好的方法,但我可以看到文件变得非常庞大且难以管理.目前我倾向于使用MongoDB.我知道为一个应用程序运行两个数据库服务器似乎很疯狂,但我认为它可以在我的情况下工作.
我很想听听你对此的看法.
我一直在为即将开展的项目进行大量的数据库设计研究.
这是典型的内部平台的问题,我们的客户基本上要无限定制和打造产品的能力和对实体属性,收集他们从最终用户的价值,并能够显示在图形上收集到的信息.
临床医生将用它来帮助监测患者,为什么即使使用EAV,我们也需要为不同的试运行收集不同的信息.有时可能是他们那天吃的东西.其他可能是血糖,或血压(这实际上是两个数字),其他可能是多个问题(今天你的疼痛怎么从1-10?),所有这些都是我们永远不会真正知道的提前最终客户要求的是什么,或者真正接受的是什么.
我们还将在整个计划中一致地绘制这些数据,并在较不规则的基础上生成更大的报告.
理想情况下,我希望尽可能多地硬编码,因为我们使用SQL,并且坚持关系数据库最佳实践将简化数据库设计和应用程序设计(我正在编写这两者).
我们正在进行一些试运行,我的第一个倾向是从客户那里获取尽可能多的信息,对数据库中的表进行硬编码,然后从那里构建.如果我们发现我们需要使用属性表和attribue_value表来收集这些属性(以及有趣的实现表单构建器,如下拉菜单 - 从而下拉菜单选项和验证/需要),我们可以这样做后来发布.
我基本上经历了每个相关的堆栈溢出帖子; 大多数人说避免EAV,更好地了解应用程序的要求,并且,在某些时候,如果客户TRULY需要EAV实施,那么继续执行它.
有没有人曾经使用混合动力车型?你能讨论一下吗?
有没有人成功实施过EAV模型,你能讨论一下吗?
你有没有做过类似的决定,决定不为一个似乎可能成为候选人的项目实施EAV?结果怎么样?
以下是我在此过程中发现的一些有趣的读物:
http://decipherinfosys.wordpress.com/2007/01/29/name-value-pair-design/ 存储时间序列数据,关系数据还是非存储数据? 数据库EAV优点/缺点和替代 实体 - 属性 - 值(EAV)的替代方案?
magento ×4
attributes ×2
php ×2
sql ×2
activerecord ×1
architecture ×1
caching ×1
json ×1
magento-1.5 ×1
mongodb ×1
nosql ×1
options ×1
sql-server ×1