标签: entity-attribute-value

设计一个"订单"模式,其中有不同的产品定义表

这是我多年来在多个地方看到的情景; 我想知道是否有其他人遇到过比我更好的解决方案......

我公司销售的产品数量相对较少,但我们销售的产品是高度专业化的(即为了选择给定的产品,必须提供大量的细节).问题在于,虽然选择给定产品所需的细节数量相对恒定,但所需的细节类型在不同产品之间差异很大.例如:

产品X可能具有识别特征,如(假设)

  • '颜色',
  • '材料'
  • '平均失败时间'

但是产品Y可能具有特征

  • '厚度',
  • '直径'
  • '能量源'

在创建同时使用产品X和产品Y的订单系统时,问题(其中之一,无论如何)是订单行必须在某个时候引用它"销售"的内容.由于产品X和产品Y在两个不同的表中定义 - 并且使用宽表格方案的产品非规范化不是一种选择(产品定义非常深) - 很难看到在这样的定义订单行的明确方法订单输入,编辑和报告的实用方式.


我过去曾经尝试过的事情

  • 创建一个名为"Product"的父表,其中包含Product X和Product Y的通用列,然后使用"Product"作为OrderLine表的引用,并创建一个FK关系,将"Product"作为Product X表之间的主要副本和产品Y.这基本上将'Product'表作为OrderLine和所有不同产品表(例如Products X和Y)的父级.它适用于订单输入,但会导致订单报告或编辑出现问题,因为"产品"记录必须跟踪它是什么类型的产品,以确定如何将"产品"加入其更详细的子产品,产品X或产品Y. 优点:保持关键关系. 缺点:在订单行/产品级别进行报告,编辑.
  • 在订单行级别创建"产品类型"和"产品密钥"列,然后使用一些CASE逻辑或视图来确定该行所引用的自定义产品.这类似于第(1)项,没有通用的"产品"表.我认为这是一个更"快速和肮脏"的解决方案,因为它完全取消了订单行和产品定义之间的外键.优点:快速解决方案. 缺点:与第(1)项相同,加上丢失的RI.
  • 通过创建公共标头表并为自定义属性使用键/值对来均匀化产品定义(OrderLine [n] < - [1] Product [1] < - [n] ProductAttribute). 优点:保持关键关系; 没有关于产品定义的含糊不清. 缺点:报告(例如,检索具有其属性的产品列表),属性值的数据类型,性能(获取产品属性,插入或更新产品属性等)

如果其他人尝试了更多成功的不同策略,我肯定希望听到它.

谢谢.

database database-design entity-attribute-value

7
推荐指数
2
解决办法
3602
查看次数

选择存储用户配置文件的方法?

我正在为一个网站开发用户配置文件系统,并在思考什么是更好(可扩展)的方法.我想出了两个解决方案,我正在寻找任何输入或指向我可能错过的东西.

以下create table语句并不是可执行的,而只是用于了解所涉及的表的布局.

我最初的想法是这样的:

CREATE TABLE user(
    id INT UNSIGNED NOT NULL AUTO_INCREMENT,

    user_email VARCHAR(320),

    user_joined DATATIME,
    user_last_seen DATATIME,

    user_name_first VARCHAR,
    user_name_last VARCHAR,

    user_name_alias VARCHAR,

    user_location_country VARCHAR,
    user_location_region VARCHAR,
    user_location_city VARCHAR

    # ...
);
Run Code Online (Sandbox Code Playgroud)

显然,这根本不是很可扩展,并且添加了令人讨厌的额外属性.一个优点是我可以快速搜索匹配特定属性集的用户.我已经做了一些环顾四周,这是一种非常常见的方法(例如Wordpress).

我的第二种方法(我正在玩的那种方法)更具可扩展性,但我对性能有点担心:

CREATE TABLE user(
    id INT UNSIGNED NOT NULL AUTO_INCREMENT,

    user_email VARCHAR(320)
);

CREATE TABLE user_profile(
    user_id INT UNSIGNED NOT NULL,

    visibility ENUM('PRIVATE', 'PUBLIC'),

    name VARCHAR,
    value VARCHAR
);
Run Code Online (Sandbox Code Playgroud)

使用此方法,每个用户都有一组与之关联的键值对,这使得添加其他属性变得微不足道,以及在用户登录时加载用户配置文件.但是我丢失了第一种方法中的所有类型信息(例如,DATETIME现在存储为格式化字符串),因此一些搜索变得烦人.这确实让我可以更好地控制用户想要公开显示哪些属性.

混合方法会更好地让我平衡两种方法的优缺点吗?SO使用什么方法?还有其他方法可以解决这个问题吗?

扩展:使用混合方法将来自用户表的属性插入user_profile表以控制其对其他用户的可见性或者可能被视为额外开销是否有利?

database database-design entity-attribute-value

7
推荐指数
1
解决办法
2803
查看次数

扩展Magento的EAV属性模型

我想为Magento的EAV属性模型添加一个新属性.这可能吗?

我知道Magento允许你使用静态字段(在实体表上)扩展模型,但我想在EAV属性表本身添加一个新字段(对于目录产品属性).新属性将是一个新设置,类似于"在类别列表中可见".

php attributes magento extend entity-attribute-value

7
推荐指数
1
解决办法
4739
查看次数

MySQL根据同一列中的值更新单个列上的多个行

我有一个如下所示的表:

ID     Key     Value     Order
1      gender  m         0
2      gender  f         0

34     age     10        0
35     age     80        0
Run Code Online (Sandbox Code Playgroud)

要更新这些行,我必须使用以下内容:

UPDATE `DemoGroup` SET `value` = 'male' WHERE `value` = 'm'
UPDATE `DemoGroup` SET `value` = 'female' WHERE `value` = 'f'
UPDATE `DemoGroup` SET `value` = '10-19' WHERE `value` = '10'
UPDATE `DemoGroup` SET `value` = '80-89' WHERE `value` = '80'
Run Code Online (Sandbox Code Playgroud)

有没有办法将此合并到一个更新语句中,而不使用ID(不保证是相同的),例如(即使这不起作用)...

UPDATE `DemoGroup` 
SET `value`= CASE `value`
    WHEN 'm' THEN 'male',
    WHEN 'f' THEN 'female' END 
WHERE `value` …
Run Code Online (Sandbox Code Playgroud)

mysql entity-attribute-value

7
推荐指数
1
解决办法
8044
查看次数

Symfony2 - 如何根据db的动态参数创建表单?(EAV)

我想基于存储在DB中的动态参数创建表单.所以我创建了一个名为Parameter的实体来定义参数名称,该实体应该显示为表单字段标签.

/**
 * @ORM\Entity
 */
class Parameter
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;
    /**
     * @ORM\Column(type="string", length="255")
     * @Assert\NotBlank()
     */
    protected $name; 
    /**
     * @ORM\OneToMany(targetEntity="ParameterValue", mappedBy="parameter")
     */
    protected $values;
Run Code Online (Sandbox Code Playgroud)

特定对象(公司对象)的参数值即将存储在ParameterValue表格中.

/**
 * @ORM\Entity
 */
class ParameterValue
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;
    /**
     * @ORM\ManyToOne(targetEntity="Parameter", inversedBy="values")
     * @ORM\JoinColumn(name="parameter_id", referencedColumnName="id", nullable=false)
     */
    protected $parameter;
    /**
     * @ORM\ManyToOne(targetEntity="Company", inversedBy="parameters")
     * @ORM\JoinColumn(name="company_id", referencedColumnName="id", nullable=false)
     */
    protected $company;
Run Code Online (Sandbox Code Playgroud)

当然,公司实体包含参数属性,该属性仅存储已为公司指定的参数.

/**
 * @ORM\Entity
 */
class …
Run Code Online (Sandbox Code Playgroud)

forms entity-attribute-value symfony

7
推荐指数
1
解决办法
1万
查看次数

如何从user和usermeta表中选择最后的用户信息?

我使用mysql,我在下面的表格中有两个表:

用户:
user_id - user_name - phone

UserMeta:
user_meta_id - user_id - meta_key - meta_value - meta_date

我有一些如下记录:

user_id: 23  
meta_key: gender  
meta_value: male  
meta_date: 1534533650



user_id: 23  
meta_key: city  
meta_value: london  
meta_date: 1534533650



user_id: 23  
meta_key: name  
meta_value: jack  
meta_date: 1534533650  



user_id: 25  
meta_key: name  
meta_value: Jamie 
meta_date: 1534593881  

user_id: 25  
meta_key: gender  
meta_value: male 
meta_date: 1534593881  

user_id: 23  
meta_key: gender  
meta_value: female  
meta_date: 1534595971

user_id: 23  
meta_key: city  
meta_value: liverpool  
meta_date: 1534595971 

And ...
Run Code Online (Sandbox Code Playgroud)

我需要获取所有注册的最新 …

mysql sql entity-attribute-value

7
推荐指数
2
解决办法
195
查看次数

什么是关系数据库中客户端可创建和可修改的Web表单的最佳实现?

在我参与的几个Web应用程序项目中,客户端要求能够创建自己的表单.问题出现在如何存储其表单定义,以及如何将用户输入的值存储到这些自定义表单中.

我已经看到它有两种方式:

  1. 假设客户端仅定义了多少个字段,以及与这些字段关联的标签; 我们可以找到一个涉及四个表的解决方案. FormDefinition,FormFieldDefinition,FormInstances,FormFieldValues.客户端对FormDefinition和进行更改FormFieldDefinition,并且Web应用程序使用该信息呈现HTML Web表单,网站访问者(最终用户)将在该表单上提交表单,其中FormInstances创建新行并将值保存在FormFieldValues表.

    行中FormDefinition定义了表单,即form definition ID = 2, form title = 'Car Registration Form'.行中FormFieldDefinition定义表单的字段FormDefinition,即field definition ID = 7, field label = 'Car Model', field type = 'varchar(50)'.行FormInstance是用户填写的每个表单的实例,即definition id = 2, date_entered = '2008-09-24'.并且行FormFieldValues是用户的条目,即field definition = 7, value = 'Tiburon'.

    不幸的是,这意味着value列FormFieldValues必须是客户端可能在Web表单中指定的最大可能大小的char类型...并且当表单定义更改时,管理旧数据变得不确定.但用户条目是可查询的(我写了一个快速查询,列出了给定表单ID的用户条目,这类似于 …

forms database-design webforms entity-attribute-value

6
推荐指数
1
解决办法
775
查看次数

这个问题的最佳实践是什么(不同类别的不同属性)?

我有一些产品属于某个类别.

每个类别可以具有不同的属性.

例如,

  • 类别汽车具有属性颜色,功率,...
  • 类别宠物有属性 重量,年龄,...

类别数量约为10-15.每个类别的属性数量为3-15.产品数量非常大.

这个应用程序的主要要求是非常好的搜索.我们将选择类别,并为此类别中的每个属性输入标准.

必须为此方案设计数据库.(SQL Server 2005)

sql database sql-server database-design entity-attribute-value

6
推荐指数
2
解决办法
3113
查看次数

Magento定制产品属性可见性

我一直在加载我的Magento网上商店,其中包含大量具有大量自定义属性的产品,但是,后端的"可见"值设置为"否".

除了这是我的错误(以及帮助我​​填写此产品数据库的人),我似乎无法找到将属性可见性设置为是的方法.

我已经尝试在attribute_id(102)中eav_attribute查找attribute_code"可见性",并希望将其设置为另一个值catalog_product_entity_int,但随后我突然意识到"我必须至少有一个属性设置为可见,所以我必须在这个值不是4"的至少一个记录.在写了一个排除4的小查询后,我发现我根本没有记录.

我究竟做错了什么?我在这看错了桌子吗?

还有另一种方法可以将属性本身的所有"可见"属性设置为"是"吗?

php attributes visibility magento entity-attribute-value

6
推荐指数
1
解决办法
5113
查看次数

单表继承,EAV还是NoSQL?

我正在为我的应用程序的数据模型寻找一个理智的方法.大多数线程专注于电子商务产品,我的情况有所不同.

目标是存储从客户收到的物品并报告给他们.虽然初始报告将是简单列表(这些是您的项目及其键/值对),但我希望为将来对集合的查询做好准备,因此我不确定EAV是一种好方法.

每个项目都是(重复)类型,每个项目将具有灵活数量的键/值对.我们有大约15种商品类型,他们不太可能快速增长.

键/值对的数量将很低,在4到20之间,并且(每个要求)不是基于项目类型,而是基于项目所属的客户.

为了澄清,客户可能希望我存储项目的条件,而另一个人可能希望我存储颜色或替换ID.这真的取决于.因此,无论如何我很可能在我的集合中都有NULL值,因为每个项目类型都将获得该客户的所有键/值.这让我觉得单表继承(带有NULL值)是可以接受的,但它必须是field_1 field_2等 - 通过某种映射,因为客户将决定所需键的名称.哪个对我不合适?

客户项目(及其键/值)的集合通常将> 20且<500,因此每个客户的数据集肯定不是很大.

也许在MySQL中为应用程序本身(创建客户及其所需的字段)中的(半)EAV是一种很好的方法,但是将实际收集的项目记录作为"文档"移动到NoSQL数据库(Redis等所有)中以进一步处理?

或者这是否可以/应该在RDBMS中解决的问题复杂化?

我也遇到了这个http://backchannel.org/blog/friendfeed-schemaless-mysql这似乎是一个解决方案但不确定,因为我的数字太低了.

rdbms database-design nosql entity-attribute-value

6
推荐指数
1
解决办法
2409
查看次数