这是我多年来在多个地方看到的情景; 我想知道是否有其他人遇到过比我更好的解决方案......
我公司销售的产品数量相对较少,但我们销售的产品是高度专业化的(即为了选择给定的产品,必须提供大量的细节).问题在于,虽然选择给定产品所需的细节数量相对恒定,但所需的细节类型在不同产品之间差异很大.例如:
产品X可能具有识别特征,如(假设)
但是产品Y可能具有特征
在创建同时使用产品X和产品Y的订单系统时,问题(其中之一,无论如何)是订单行必须在某个时候引用它"销售"的内容.由于产品X和产品Y在两个不同的表中定义 - 并且使用宽表格方案的产品非规范化不是一种选择(产品定义非常深) - 很难看到在这样的定义订单行的明确方法订单输入,编辑和报告的实用方式.
我过去曾经尝试过的事情
如果其他人尝试了更多成功的不同策略,我肯定希望听到它.
谢谢.
我正在为一个网站开发用户配置文件系统,并在思考什么是更好(可扩展)的方法.我想出了两个解决方案,我正在寻找任何输入或指向我可能错过的东西.
以下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表以控制其对其他用户的可见性或者可能被视为额外开销是否有利?
我想为Magento的EAV属性模型添加一个新属性.这可能吗?
我知道Magento允许你使用静态字段(在实体表上)扩展模型,但我想在EAV属性表本身添加一个新字段(对于目录产品属性).新属性将是一个新设置,类似于"在类别列表中可见".
我有一个如下所示的表:
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) 我想基于存储在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) 我使用mysql,我在下面的表格中有两个表:
用户:
user_id - user_name - phoneUserMeta:
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)
我需要获取所有注册的最新 …
在我参与的几个Web应用程序项目中,客户端要求能够创建自己的表单.问题出现在如何存储其表单定义,以及如何将用户输入的值存储到这些自定义表单中.
我已经看到它有两种方式:
假设客户端仅定义了多少个字段,以及与这些字段关联的标签; 我们可以找到一个涉及四个表的解决方案. 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的用户条目,这类似于 …
我有一些产品属于某个类别.
每个类别可以具有不同的属性.
例如,
类别数量约为10-15.每个类别的属性数量为3-15.产品数量非常大.
这个应用程序的主要要求是非常好的搜索.我们将选择类别,并为此类别中的每个属性输入标准.
必须为此方案设计数据库.(SQL Server 2005)
sql database sql-server database-design entity-attribute-value
我一直在加载我的Magento网上商店,其中包含大量具有大量自定义属性的产品,但是,后端的"可见"值设置为"否".
除了这是我的错误(以及帮助我填写此产品数据库的人),我似乎无法找到将属性可见性设置为是的方法.
我已经尝试在attribute_id(102)中eav_attribute查找attribute_code"可见性",并希望将其设置为另一个值catalog_product_entity_int,但随后我突然意识到"我必须至少有一个属性设置为可见,所以我必须在这个值不是4"的至少一个记录.在写了一个排除4的小查询后,我发现我根本没有记录.
我究竟做错了什么?我在这看错了桌子吗?
还有另一种方法可以将属性本身的所有"可见"属性设置为"是"吗?
我正在为我的应用程序的数据模型寻找一个理智的方法.大多数线程专注于电子商务产品,我的情况有所不同.
目标是存储从客户收到的物品并报告给他们.虽然初始报告将是简单列表(这些是您的项目及其键/值对),但我希望为将来对集合的查询做好准备,因此我不确定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这似乎是一个解决方案但不确定,因为我的数字太低了.
database ×3
attributes ×2
forms ×2
magento ×2
mysql ×2
php ×2
sql ×2
extend ×1
nosql ×1
rdbms ×1
sql-server ×1
symfony ×1
visibility ×1
webforms ×1