我理解EAV中的三个基本故障,即重新组装数据需要做大量的工作.但是,我想要一个可以添加自定义字段的数据库.很多人说Virtuemart允许自定义字段但不使用EAV数据库结构.有人可以解释如何做到这一点或提供链接?
有人可以推荐存储一般网站首选项的最佳做法吗?例如,如果脚本未设置一个默认页面标题,或者要在内容框中显示的特色项目数,或者系统在上载图片时应该制作的缩略图大小列表.集中这些值具有明显的好处,即允许人们轻松更改可能在许多页面上使用的首选项.
我的默认方法是将这些首选项作为属性/值对放在*gulp*EAV表中.
这个表不可能变得很大,所以我不太担心性能.我的架构的其余部分是关系型的.它确实会让一些该死的丑陋查询:
$sql = "SELECT name, value FROM preferences"
. " WHERE name = 'picture_sizes'"
. " OR name = 'num_picture_fields'"
. " OR name = 'server_path_to_http'"
. " OR name = 'picture_directory'";
$query = mysql_query($sql);
if(!$query) {
echo "Oops! ".mysql_error();
}
while($results = mysql_fetch_assoc($query)) {
$pref[$results['name']] = $results['value'];
}
Run Code Online (Sandbox Code Playgroud)
有谁能建议更好的方法?
我有一个超过100K记录的数据库.许多类别和许多项目(每个类别具有不同的属性)所有内容都存储在EAV中.
如果我试图打破这个方案并为任何类别创建一个独特的表是我必须避免的?
是的,我知道我可能会有很多表,如果我想添加一个额外的字段,我需要更改它们,但这是错的吗?
我还读到,尽管有很多表,但db会填充更多文件,这对任何文件系统都不利.
有什么建议吗?
我已经接管了一个项目,它有一个包含超过30列的用户表.糟糕的是,列的更改和添加不断发生.
这不对.
我应该推动将额外的字段作为值移动到第二个表中并创建存储这些列名的第三个表吗?
user
id
email
user_field
id
name
user_value
id
user_field_id
user_id
value
Run Code Online (Sandbox Code Playgroud) 假设我有一个遗留应用程序,由于各种原因,以前的开发人员决定必须具有任意灵活的模式,并且他们再次重新创建了实体 - 属性 - 值模型.他们实际上正在尝试构建一个文档存储库,对于像Mongo或Couch这样的工具现在更适合当今世界,但以前的团队不可用或不知道.
为了保持竞争力,假设我们需要构建更强大的方法来查询和分析系统中的信息.基于纯粹的数量和属性的多样性,似乎map/reduce更适合我们的问题,而不是逐渐将系统重构为更多的关系模式.
原始源数据库有数百万个文档,但只有少量不同的文档类型.不同文档类型之间存在一些共性.
从MySql中的大规模EAV实施迁移到像Mongo或Couch这样的面向文档的商店,有什么有效的策略?
我当然可以想象一种攻击方法,但是我真的希望看到一个教程或战争故事,向已经攻击过这类问题的人学习.
做这种转换的策略是什么?你学到了什么教训?我应该避免哪些陷阱?您是如何处理仍希望能够与现有数据库交互的遗留应用程序的?
起源...
我有一个带有安装脚本的模块(常见的mysql4-upgrade-0.1.0-0.1.1.php),添加了一个引用的属性:
$eav = new Mage_Eav_Model_Entity_Setup('sales_setup');
$eav->addAttribute('quote', 'my_attribute', array('type' => 'varchar'));
Run Code Online (Sandbox Code Playgroud)
如果我在空数据库上运行magento存储,则运行设置脚本并且"错误的实体ID"错误会破坏该进程.调用堆栈指向我的安装脚本.
...寻找...
如果我去数据库,我看到eav_entity_type表填充但只有8种类型:报价类型没有注册!
这就是Mage_Eav_Model_Entity_Setup-> getEntityTypeId()抛出异常的原因.
问题:
我不知道为什么引用实体不是用其他实体创建的.在模块设置之前,如何强制magento注册报价实体?还有其他选择吗?
有一个可能相关的问题
我试图在Magento 1.7.0.0中设置一个自定义实体,跟随alan风暴文章关于它,但是通过这个简单的安装脚本,它告诉我"无法创建表:eavblog_posts".
我的安装脚本是deadsimple,看起来像这样:
<?php
$installer = $this;
$installer->addEntityType('complexworld_eavblogpost',
Array(
'entity_model'=>'complexworld/eavblogpost',
'attribute_model'=>'',
'table'=>'complexworld/eavblogpost',
'increment_model'=>'',eav/entity_increment_numeric
'increment_per_store'=>'0'
));
$installer->createEntityTables(
$this->getTable('complexworld/eavblogpost')
);
Run Code Online (Sandbox Code Playgroud)
如何让我的安装脚本正常工作?这是一个已知的magento bug吗?
我正在使用模块在客户模型上创建新属性.有谁知道如何使用我的设置脚本设置默认商店视图?

我目前的剧本:
$setup = new Mage_Customer_Model_Resource_Setup('customer_setup');
if (! $setup->getAttribute('customer', 'dob_month')) {
$setup->addAttribute('customer', 'dob_month', array(
'label' => 'Month',
'type' => 'varchar',
'input' => 'select',
'source' => 'eav/entity_attribute_source_table',
'required' => true,
'position' => 1,
'option' => array (
'values' => array (
'January',
'February',
'March',
'April',
'May',
'June',
'July',
'August',
'September',
'October',
'November',
'December'
)
)
));
}
Run Code Online (Sandbox Code Playgroud) 通过检查销售模块的配置,sales_entity部分如下所示
<models>
<sales>
<class>Mage_Sales_Model</class>
<resourceModel>sales_resource</resourceModel>
</sales>
<sales_entity>
<class>Mage_Sales_Model_Entity</class>
<entities>
<quote>
Run Code Online (Sandbox Code Playgroud)
而这些课程Mage_Sales_Model_Entity_xxx延伸Mage_Eav_Model_Entity_Abstract,表明销售/订单是EAV风格而不是扁平的.我还可以找到表"eav_entity_type"有很多与"订单"相关的记录.
但是,遗憾的EAV是,我仔细检查了代码,并不是最新的代码库(至少是v1.7).任何人都可以帮忙澄清一下吗?是EAV销售/订单deperecated?
案子:
表:
product:
product_id|name |
------------------------
1 |iphone 4 |
2 |gallaxy 2 |
3 |blackbery 6 |
product_attribute:
id|product_id|attribute_id
--------------------------------------------------
1 |1 |2
2 |1 |6
. . .
attribute:
------------------------------
attribute_id|name |value|
1 |width |300
2 |width |320
3 |width |310
4 |height|390
5 |height|370
6 |height|380
Run Code Online (Sandbox Code Playgroud)
应该得到结果:
product_id|height|width
1 |380 |320
......................
Run Code Online (Sandbox Code Playgroud)
编辑: 高度和宽度属性只是产品属性的一部分 - 产品需要具有动态能力,由用户在后端添加,就像在magento中一样,因为我选择了eav db design.如果我们不知道产品有哪些名称,请尽可能写查询.
谢谢
magento ×4
mysql ×3
php ×3
database ×2
sql ×2
couchdb ×1
installation ×1
mongodb ×1
preferences ×1
quote ×1
virtuemart ×1