我们正在启动一个新项目,其中需要在数据库中存储产品和许多产品属性.用于数据访问的技术堆栈是MS SQL2008和Entity Framework4.0/LINQ.

产品(和产品表)非常简单(SKU、制造商、价格等).但是,每个产品也有许多属性需要存储(想想工业小部件).这些范围可能从 colored颜色 到认证,再到管道尺寸.每个产品可能具有不同的属性,有些产品可能具有相同属性的多个属性(例如:认证).

当前的建议是,我们基本上会有一个名称/值对表,在每一行中都有一个FK返回到产品ID.

属性表的示例可能如下所示:

ProdID     AttributeName     AttributeValue
123        Color             Blue
123        FittingSize       1.25
123        Certification     AS1111
123        Certification     EE2212
123        Certification     FM.3
456        Pipe              11
678        Color             Red
999        Certification     AE1111
...

注意:属性名称可能来自查找表或枚举.

所以这里的主要问题是:这是做这种事情的最佳模式吗?演出怎么样?查询将基于产品和属性表的连接,并且通常需要在特定属性上找到许多过滤位置-最常见的搜索将是基于一组已知/所需属性来查找产品.

如果有人对这类数据有任何建议或更好的模式,请告诉我.

谢谢! -边

推荐答案

您即将重新发明可怕的EAV模型,即实体-属性-值.这是因为在现实生活中存在问题而臭名昭著的,原因多种多样,其中许多都在戴夫的回答中有所涉及.

幸运的是,SQL客户咨询团队(SQLCAT)有一份关于该主题的白皮书, Best Practices for Semantic Data Modeling for Performance and Scalability美元.我强烈推荐这份报纸.不幸的是,它没有提供万能药,没有千篇一律的解决方案,因为问题没有解决方案.相反,您将了解如何在固定的可查询模式和灵活的EAV struct 之间找到平衡点,该平衡点适用于您的特定情况:

语义数据模型可以非常 复杂且直到语义数据库 通常都是可用的,挑战是 剩下的就是找到最优的平衡点 在纯对象模型和 每个对象的纯关系模型 申请.成功的关键是 了解问题,使 对这些人进行必要的减刑 问题,然后测试、测试和测试. 可伸缩性测试是至关重要的 成功的因素,如果你要 找到最佳设计.

Database相关问答推荐

为Postgres数据库字段创建复合索引

如何限制报表中返回的行数?

如何在同一个表的派生部分引用主键?

使用 Npgsql 执行年龄查询并在 .NET 应用程序中返回结果?

MongoDB 中的 OVER PARTITION 类似功能

即使将enable_seqscan设置为关闭,也未使用数组列上的 GIN 索引?

add_index 到数据模型 - Ruby on Rails 教程

Java中基于文件的数据库

锁定机制(悲观/乐观)如何与数据库事务隔离级别相关?

xtradb vs innodb

审计表:一个表或一个表的每个字段

数据库中一致且全面的地址存储的最佳实践

Hibernate 的 MariaDB 方言类名称是什么?

如何通过 PHP 和 Linux 使用 pdo 连接到 mssql?

为数据库应用程序留下审计跟踪/更改历史的有效策略?

我应该在数据库模式中允许空值吗?

Python中的内存数据库

xampp phpmyadmin,格式参数不正确

为什么实体框架连接需要元数据属性?

如何在我的数据库中避免 NULL,同时还表示丢失的数据?