假设我们有一个应该能够存储所有类型产品的应用程序.每个产品至少具有一个ID和一个Name但是所有其他属性可以由用户自己定义.
您如何根据上述要求对模式进行建模?
注意:要求4.很重要!
感谢大家的贡献和讨论方法.我在过去看到过这个问题的一些解决方案,但没有一个能让我轻松分组:(
sql sql-server schema database-design entity-attribute-value
我怎样才能完成:
select * from table where column_value is int
Run Code Online (Sandbox Code Playgroud)
我知道我可能内部加入系统表和类型表但我想知道是否有更优雅的方式.
请注意,column_value是一个"可能"具有int的varchar,但不一定.
也许我可以抛出它并捕获错误?但同样,这似乎是一个黑客.
我正在研究EAV框架,似乎许多RDF框架可用于提供EAV框架。
例如,使用RDF存储和诸如LinqToRDF之类的东西,我是否可以使用现成的.NET EAV Framework?
创建属性并将它们分配给现有属性集是一个已解决的问题,但我们遇到了一个问题,即尝试创建属性集并使用默认属性填充它,并且特定属性失败.这是使用中的代码:
$setup->addAttributeSet('catalog_product', 'women_sizing_denim');
$oAttributeSetModel = Mage::getModel("eav/entity_attribute_set")
->load($setup->getAttributeSetId('catalog_product', 'women_sizing_denim'))
->initFromSkeleton($setup->getAttributeSetId('catalog_product', 'default'))
->save();
Run Code Online (Sandbox Code Playgroud)
我可以通过调试验证该initfromSkeleton方法是否按照公布的方式从默认的attribute_set加载属性,但是在之后save(),新的集合为空.
可以在集合中添加新属性,因此它确实存在并且正确创建,但缺少的默认属性使其无法使用,因为SKU,价格,名称等都是必需的.
我正在比较Magento社区版和企业版。在“社区”下创建新产品时,产品属性url_path(attribute_id= 98)的值将正确保存在表中catalog_product_entity_varchar。
但是,当在“企业”下创建同一产品时,该属性值似乎没有被保存。我catalog_product_entity_varchar在url_path属性表中没有看到任何值。
社区和企业如何对待url_path属性之间有什么区别?企业版是否真的在url_path某个地方利用了价值?
我有 2 张桌子:
桌子objects:
object_id | object_group_id
Run Code Online (Sandbox Code Playgroud)
桌子attributes:
attr_id | attr_object_id | attr_property_id | attr_value
Run Code Online (Sandbox Code Playgroud)
现在,我想获取所有object_id位置object_group_id = 1并过滤两个属性:
(attr_property_id = 1 AND attr_value <= '100000')
AND
(attr_property_id = 2 AND attr_value > '2000')
Run Code Online (Sandbox Code Playgroud)
我试图构建一些查询,如下所示:
SELECT * FROM objects as o
/* filter1 join */
INNER JOIN
attributes AS f1
ON
o.object_id = f1.attr_object_id
AND
f1.attr_property_id = 1
/* filter2 join */
INNER JOIN
attributes AS f2
ON
f1.attr_object_id = f2.attr_object_id
AND
f2.attr_property_id …Run Code Online (Sandbox Code Playgroud) 我需要实现一个相当标准的实体-属性-值层次结构。有多种类型的设备,每种类型都有一堆可以设置的设置,每个单独的设备都有针对每个设置的一组特定值。看来django-eav和eav-django软件包都不再维护了,所以我想我需要自己动手。但是,我该如何设计呢?到目前为止,我在想这样的事情(跳过很多细节)
DeviceType(Model)类:
名称= CharField()
类Device(Model):
名称= CharField()
类型= ForeignKey(DeviceType)
类设置(模型):
名称= CharField()
类型= CharField(choices =((('Number','int'),('String','str'),('Boolean','bool')))
device_type = ForeignKey(设备类型)
类Value(Model):
设备= ForeignKey(设备)
设置= ForeignKey(设置)
值= CharField()
def __setattr __(自身,名称,值):
如果名称=='值':
...根据设置类型进行验证...
def __getattr __(自己,名字):
如果名称=='值':
...将字符串转换为该类型的正确值...
我想念什么吗?有更好的方法吗?这样行吗?
我正在学习 magento,我刚刚阅读了有关 EAV 的内容。如果我理解正确的话,它就像在 SQL 数据库上模拟 noSQL 数据库。因此,例如,像铅笔这样的产品在其描述中可以具有与计算机或球不同的属性。
但是我在一本书中读到了这个系统,比如:
所有这些灵活性和权力都不是免费的,需要付出代价;实施 EAV 模型会导致我们的实体数据分布在大量表上,例如,只有产品模型分布在大约 40 个不同的表上。
[...]
EAV 的另一个主要缺点是在检索大型 EAV 对象集合时会损失性能并增加数据库查询的复杂性。由于数据更加碎片化(存储在更多表中),选择单个记录涉及多个连接。
我是全新的,所以也许我失去了一些东西,但我的问题是:
为什么使用这种复杂的方式而不是使用基于文档的数据库作为 mongoDB?
我有一个 PostgreSQL 9.6 数据库,其中有一个根据 EAV 模型设计的表,其中包含不同类型的值。示例摘录如下所示:
name |arrivalTime | boolValue | intValue | floatValue | stringValue
------+------------+-----------+----------+------------+------------
a1 | 10:00:00 | true | | |
c3 | 10:00:00 | | 12 | |
d4 | 10:00:00 | | | | hello
e5 | 15:00:00 | | | 45.67 |
c3 | 15:00:00 | | 45 | |
b2 | 20:00:00 | | | 4.567 |
a1 | 20:00:00 | false | | |
d4 | 22:00:00 | | | …Run Code Online (Sandbox Code Playgroud) 我想知道在jsonb上构建EAV的正确方法是什么。我有Attribute-> Values表格,就像在标准EAV中一样。
CREATE TABLE attribute_values
(
id INTEGER,
attribute_id INTEGER,
value VARCHAR(255)
);
CREATE TABLE attributes
(
id INTEGER,
name VARCHAR(255)
);
Run Code Online (Sandbox Code Playgroud)
值将保存在attributes提起Entity
CREATE TABLE entity
(
id INTEGER,
title TEXT,
attributes JSONB
);
Run Code Online (Sandbox Code Playgroud)
Attribute创建用于控制重复属性的表的类型,并更好地确定它是什么属性。例如,避免:{weight: 100}和{Weight: 100}或{weigh: 100}。Values适用于使用唯一值并包含可用值列表,例如颜色(绿色,红色,白色等)。可以预加载值并将其用于常用搜索。
我看到几个选择:
1.存储格式如
[{"attribute_id":1, "value":5},{"attribute_id":1, value:"text"}]
Run Code Online (Sandbox Code Playgroud)
这里value_id将是custom value像文字或id从Values表。但我不明白如何建立索引的格式,例如,如果Attribute 10将integer
2.仅保留Attribute表(用于控制attribute name)并存储数据,例如:
{"price": …Run Code Online (Sandbox Code Playgroud) magento ×3
sql ×3
postgresql ×2
attributes ×1
crosstab ×1
django ×1
jsonb ×1
magento-1.9 ×1
mongodb ×1
mysql ×1
php ×1
python ×1
rdf ×1
schema ×1
sql-server ×1
t-sql ×1