可以肯定地说,EAV/CR数据库模型很糟糕.那说,
问题:应该使用什么数据库模型,技术或模式来处理描述可以在运行时更改的电子商务产品的属性的"类"?
在一个好的电子商务数据库中,您将存储选项类别(如电视分辨率,然后为每个电视分辨率,但下一个产品可能不是电视,没有"电视分辨率").如何存储它们,有效搜索,并允许用户使用描述其产品的可变字段设置产品类型?如果搜索引擎发现客户通常根据控制台深度搜索电视,则可以向字段添加控制台深度,然后在运行时为每种电视产品类型添加单个深度.
良好的电子商务应用程序中有一个很好的共同特征,它们显示一组产品,然后"向下钻取"侧面菜单,您可以看到"电视分辨率"作为标题,以及前五个最常见的电视分辨率发现集.您单击一个,它只显示该分辨率的电视,允许您通过选择侧面菜单上的其他类别进一步向下钻取.这些选项是运行时添加的动态产品属性.
进一步讨论:
长话短说,互联网上是否有任何链接或模型描述可以"学术上"修复以下设置? 我感谢Noel Kennedy建议的类别表,但需要的可能还要大于此.我在下面用不同的方式描述它,试图强调其意义.我可能需要进行视点校正来解决问题,或者我可能需要深入了解EAV/CR.
喜欢对EAV/CR模型的积极响应.我的开发人员都说杰弗里·肯普在下面提到了什么:"新实体必须由专业人士建模和设计"(脱离背景,阅读下面的回复).问题是:
客户希望为产品添加属性有两个原因:
属性必须具有重要性,而不仅仅是关键字搜索.如果他们想要比较所有有"奶油糖霜"的蛋糕,他们可以点击蛋糕,点击生日主题,点击生奶油糖霜,然后检查所有有趣的蛋糕,知道他们都有奶油糖霜.这不仅仅是蛋糕,只是一个例子.
sql database design-patterns key-value entity-attribute-value
在我的块代码中,我尝试以编程方式检索具有特定值属性的产品列表.
或者,如果不可能,那么如何检索所有产品然后过滤它们以仅列出具有特定属性的产品?
如何使用标准布尔过滤器执行搜索AND或OR匹配我的产品的子集?
乔纳森日说
"更新不应该以SQL命令的形式".我没有遇到任何无法通过Magento配置结构执行的DDL或DML语句.
(在问题中如何将配置更改从开发迁移到生产环境?)
我想知道如何以这种方式向表中添加/修改/删除列或索引,但不依赖于SQL?它甚至可能吗?
此外,还有哪些其他操作只能在SQL中完成?
我们的数据库是基于EAV(实体 - 属性 - 值)模型设计的.那些使用EAV模型的人知道为了灵活性而附带的所有垃圾.
我向我的客户询问了使用EAV模型的原因(灵活性),他们的反应是:他们的实体随着时间而变化.因此,今天他们可能有一个具有一些属性的表,但在一个月的时间内,可能会添加一些新属性,或者可能会重命名现有属性.他们需要生成报告以回到任何阶段,并根据该阶段的实体形状查询数据.
我理解这对于传统的关系模型是不可行的,但我个人认为EAV是反模式的.是否有其他替代模型使我们能够捕获实体和实例更改的时间维度?
干杯,莫什
database database-design data-modeling entity-attribute-value data-structures
我一直在寻找一个数据库解决方案,允许用户定义的字段和值(允许无限数量).乍一看,EAV似乎是合适的,但经过一些阅读后我不再确定了.
EAV的优点和缺点是什么?
是否有替代数据库方法来允许用户定义的属性/字段和值?
我正在为电子商务应用程序设计我的数据库/域,而我很难弄清楚如何存储产品.
该网站将出售各种产品,钢笔,丁字裤,纹身,雨伞,应有尽有.这些产品中的每一个都会分享一些常见的属性,高度,宽度,长度,重量等,但有些产品有特殊数据.例如,笔具有不同的墨水颜色,并且提示/盖子和小册子可以具有不同类型的折叠.到目前为止,我已经考虑了20多个额外属性,但这些属性可能仅适用于网站上1%的产品.
所以我想知道是否适合实施EAV模型来处理额外的数据.请记住,当客户在前端查看网站时,会有一个过滤侧边栏,如eBay和carsales.com.au.(所以记住会有一些相当多的查询)
我认为实现类表继承是不切实际的,因为系统需要保持灵活性.这是因为,在未来的轨道上,我们可能会在未来使用新类型的产品时拥有更多属性.
我考虑的另一件事是使用NoSQL数据库(可能是MongoDB)但是我对这些类型的数据库没什么经验,它甚至可以解决我的问题吗?
审查选项:
我正在构建一个带有属性实体的原型,以查看它的灵活性,测试性能以及查询失控的方式.
编辑:我当然对任何其他解决方案持开放态度.
php database-design magento entity-attribute-value doctrine-orm
我想使用实体 - 属性 - 值(EAV)方法创建患者/样本元数据表.
问:我应该如何处理的不同列类型的值(如字符串,数字,或外键的字典表)的基础上的属性?
注意:我不是在问是否使用EAV方法.我查看了其他SO问题和参考资料,并认为这是我用例的最佳方法(例如,我不想为每个属性创建一个单独的列或表- 可以数百个).但是,我会在一个全面的例子中重新考虑其他设计.
患者/样品(实体)可以有多个元数据属性(例如实验室位置,存活,肿瘤类型)每一个具有不同值的类型(例如VARCHAR,NUMBER,FOREIGN_KEY*,分别地).
*FOREIGN_KEY表示该值类型是一个外键ID( INTEGER)到的词典表的值(例如10种可能肿瘤类型的列表).因此,实验室位置可能VARCHAR因为我不关心这些值的标准化.但是肿瘤类型应该有一定程度的验证.
我的表格布局可能如下所示:
CREATE TABLE patients (
patient_id INTEGER CONSTRAINT pk_patients PRIMARY KEY,
patient_name VARCHAR2(50) NOT NULL
);
CREATE TABLE metadata_attributes (
attribute_id INTEGER CONSTRAINT pk_metadata_attributes PRIMARY KEY,
attribute_name VARCHAR2(50) NOT NULL,
attribute_value_type VARCHAR(50) NOT NULL …Run Code Online (Sandbox Code Playgroud) database oracle plsql database-schema entity-attribute-value
我目前正在为电子商务平台的产品部分设计数据库结构.它需要以这样的方式设计,使得可以销售具有无限多个不同属性的无限数量的不同类型的产品.
例如,笔记本电脑的属性可以是RAM,屏幕尺寸,重量等.书的属性可以是作者,ISBN,出版商等.
似乎EAV结构最合适.
假设上述情况,我是否可以将选择加入attribute_values_datetime表以获取正确的数据而不获取结果集并在表已知的情况下构建第二个查询?构建这种类型的查询是否会有很大的性能损失,或者下面的内容会更合适(尽管功能较少)
mysql sql database-design database-schema entity-attribute-value
我需要设计存储文件所有元数据的表(即文件名,作者,标题,创建日期)和自定义元数据(用户已添加到文件中,例如CustUseBy,CustSendBy).无法预先设置自定义元数据字段的数量.实际上,确定在文件中添加了什么和多少自定义标记的唯一方法是检查表中存在的内容.
为了存储它,我创建了一个基表(具有文件的所有公共元数据),一个Attributes表(包含可以在文件上设置的附加,可选属性)和一个FileAttributes表(为文件的属性赋值).
CREAT TABLE FileBase (
id VARCHAR(32) PRIMARY KEY,
name VARCHAR(255) UNIQUE NOT NULL,
title VARCHAR(255),
author VARCHAR(255),
created DATETIME NOT NULL,
) Engine=InnoDB;
CREATE TABLE Attributes (
id VARCHAR(32) PRIMARY KEY,
name VARCHAR(255) NOT NULL,
type VARCHAR(255) NOT NULL
) Engine=InnoDB;
CREATE TABLE FileAttributes (
sNo INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
fileId VARCHAR(32) NOT NULL,
attributeId VARCHAR(32) NOT NULL,
attributeValue VARCHAR(255) NOT NULL,
FOREIGN KEY fileId REFERENCES FileBase (id),
FOREIGN KEY attributeId REFERENCES Attributes …Run Code Online (Sandbox Code Playgroud) 是否有针对PHP/MySQL的实体属性值框架?我开始写自己的,但我觉得它已经完成了.有什么建议?
database ×4
php ×4
sql ×4
magento ×3
mysql ×2
doctrine-orm ×1
e-commerce ×1
installation ×1
key-value ×1
nosql ×1
oracle ×1
pivot ×1
plsql ×1