sql - 产品和变体 - 设计数据库的最佳方式

标签 sql database

描述

商店可以有产品(鞋子、T 恤等)。每个产品可以有很多变体,每个变体可以有不同的价格和库存,例如T 恤有不同的颜色和尺寸

  • 颜色:蓝色,尺码:L,价格:10 美元,库存:5
  • 颜色:蓝色,尺码:XL,价格:10 美元,库存:10
  • 颜色:白色,尺码:L,价格:10 美元,库存:6

图中描述了我对这个问题的解决方案

http://dl.dropbox.com/u/43925242/erd_product_variant.png

但是这个方案有一些缺点

  • 很难控制同一产品的每个变体应具有相同数量的 variant_features,
  • 通过变体功能搜索产品可能需要一些时间,
  • 关于我不知道的任何其他...?

对于这个问题,您有什么建议可以简化数据库的设计?

=====更新======

那 NoSQL 解决方案呢?有什么建议吗?

最佳答案

基本问题是“如何存储父类的异构子类型?”。有许多选项 - 您选择的选项有点混合,这不一定是坏事。

关于这个主题,我所看到的最好的描述是在 Craig Larman 的书“应用 UML 和模式”中——尽管他是从面向对象的角度而不是数据库的角度来写的。

首先要注意的是:您设置“变体”的方式可能不是您想要的 - 它表明“价格”和“库存”一起移动,而它们是非常独立的数据位。我会考虑将它们分解到自己的表中——“variant_price”和“variant_stock”。

其次,您选择用来表示特征的选项通常称为“实体属性值”或 EAV。它的主要好处是允许您在设计时不知道其架构的情况下存储数据,但它会使任何类型的 bool 查询变得非常痛苦 - 想象一下寻找所有 XL 码的红色 T 恤。

关系世界中有 3 种选择(这是基于 Larman 的书):

  • 每个变体的子类型。所以,你创建一个“variant_tshirt”表 尺寸、颜色等,以及带有尺寸、颜色、内部的“variant_trouser” 腿等。这使表保持美观和 self 描述,但使 您的 SQL 变得一团糟 - 它必须针对每个子类型进行更改。

  • 包含所有可能列的单个表:在这种情况下,您有一个 包含所有子类型的所有可能字段的单个表。这边走, 您的 SQL 保持简单得多 - 但表变得一团糟,并且 你依靠你的客户端应用程序来“知道”裤子有 内裤腿属性,而T恤没有。

  • 常用属性表 子类型将它们的唯一值存储在它们自己的表中。在 这个模型,假设你只有裤子和 t=shirts,你有 一个带有尺寸和颜色的“变体”表,以及一个带有 腿内侧。

每个选项都有优点和缺点 - 特别是在您事先不知道需要哪些子类型的情况下,第一个选项在数据库端是最简单的,但会造成一些困惑客户端代码。

在 SQL 之外,您可以使用 XML - 使用 XPath,您可以轻松执行 bool 查询,或者 NoSQL - 但 NoSQL 在这里不是我最喜欢的,它们中的大多数在概念上都基于键值关系,这使得 bool 查询相当困难。

关于sql - 产品和变体 - 设计数据库的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7832495/

相关文章:

sql - 如何在不删除表的情况下更新数据库模式

php - 发生数据库错误错误号: 1066 Not unique table/alias:

sql - 嵌套自连接并创建多个总和

sql - PostgreSQL 相当于 MongoDB 的 Mongoose?

sql-server - Sql Server中如何跟踪表结构的变化

mysql - 如何在 mysql 中为大量用户创建消息系统而无需花费太多时间?

mysql - SQL:可以用更好的方法解决吗?

mysql - 从特定范围中选择全部

SQL Server 在填充了值的列上加入

php - 如何在 apache2 服务器上执行 PHP 长时间脚本?