【问题标题】:Inventory design database with colors and sizes带有颜色和尺寸的库存设计数据库
【发布时间】:2015-03-06 14:49:15
【问题描述】:

我正计划设计一个库存数据库来跟踪我们商店的库存。我正在考虑在数据库中存储一个具有所有大小和颜色的数组,例如:

array('S-groen' => 6,'M-groen' => 0,'L-groen' => 2,'S-zwart' => 9,'M-zwart' => 0,'L-zwart' => 3);

其中 S 是尺寸,groen 是颜色。

但是这样做是一种好习惯,还是有更好的方法?

所以我的数据库将是:ID - product_id - aantal。在 aantal 中将是数组。

【问题讨论】:

  • 真的取决于你要使用什么类型的数据库。基于 SQL 或 noSQL
  • 您将需要一张产品表、一张尺寸表、一张颜色表。然后是一个表格,其中列出了产品的尺寸和该尺寸的颜色。我希望这是有道理的。如果您需要更多详细信息,可以通过我的个人资料电子邮件给我发送电子邮件。
  • 我想我们可以试试。它有很多文字要放。您需要一个产品表,其中列出了产品的属性、名称、sku、项目编号、成本、销售等
  • @LuckyBurger 这取决于数据模型的标准化程度。单个 char 大小的列可能比几乎在每个查询中都有一堆连接的全新表更有性能和效率。

标签: php database database-design inventory


【解决方案1】:

正如其他人所说,不要制作数组。数组难读、难处理、难查询。

相反,制作一张颜色表和一张尺寸表。

尺码表可能只有一个尺码 ID 和一个尺码描述。 ID 可以是具有自动增量的整数,例如 1=small、2=medium、3=large,无论您的尺寸是多少。由于尺寸通常由短缩写标识,您可以使用缩写作为主键:'S'=small、'M'=medium 等。主键应该很短,但典型的尺寸缩写很少超过 4 个字符 - - XXXL --- 与大多数数据库引擎上的整数大小相同或小于整数(整数通常为 4 或 8 个字节)。

同样,颜色表将颜色 ID 与颜色名称相关联。同样,ID 可以是一个整数:1=red、2=green、3=orange 等。或者您可以组成简短的缩写。

现在让我们暂时忽略这个问题并退后一步。

您应该有一个产品表,其中包含有关产品的各种信息,例如描述、制造商、价格、我工作过的库存系统总是有很多东西,例如产品类别、运输重量、会计代码等等。在某些库存系统中,您只需将每个项目的现有数量存储在产品记录中。也就是说,如果您有 20 个库存小部件,那么在小部件记录中,您有一个“数量”字段,并且您存储数字 20。在其他库存系统中,库存中的每个项目都有一个记录,即是一个附加的“库存”或“库存项目”表,每个项目都有一条记录,如果您有 20 条库存,那么您就有 20 条记录。

如果您有库存项目记录,您可以将尺寸和颜色字段(尺寸和颜色表的外键)添加到库存项目记录。如果没有与尺寸和颜色组合相关的其他信息,那将是一个很好的答案。

但我猜你的产品上有条形码,至少在美国的做法是,每种尺寸和颜色组合都有不同的条形码。因此,如果您将尺寸和颜色放入库存项目记录中,则必须在每个库存项目记录中重复条形码。重复数据 = 错误。也许您还有其他与尺寸和颜色相关的数据。

更好的是,正如 stwalkerster 所说,创建“产品变体”记录。那么这个记录会有一个指向产品记录的指针、一个指向尺寸记录的指针和一个指向颜色记录的指针。它还将具有条形码值和任何其他公共数据。然后,库存项目记录将指向产品变化记录而不是产品记录。也就是说,您将有 3 个级别:产品,每个产品都有很多变体,每个变体都有很多库存项目。

如果您不需要单独的库存项目记录,那么您可以将数量存储在产品变化记录中。

您可以将尺寸和颜色信息放在产品记录中,避免需要两个级别。但这几乎肯定会产生大量重复数据。我猜如果你有,比如说,某种款式的衬衫,有各种尺寸和颜色可供选择,那件衬衫至少必须有一个描述,“牛津男式正装衬衫,带纽扣颜色”或其他什么。您不想为每种不同的尺寸和颜色重复该描述。不仅在硬盘上浪费了大量空间,而且现在您必须担心用户键入的内容略有不同,然后您无法确定“Oxford men's dress shirt with button down color”是否相同例如“正装衬衫、牛津布、男装”等。您可能还有与每个产品相关的会计代码等,这些产品会被重复。

您质疑为每个此类变体单独记录是否不会占用大量磁盘空间并减慢系统速度。

但是想一想:它实际上会为您的库存商品表占用更少的空间。您将拥有一个指向产品变化记录的单点,而不是指向产品记录的指针以及尺寸/颜色数组的索引。少一个字段。

当然,您会有这个额外的表格,即产品变体表格。但它的数据量与您的尺寸/颜色数组大致相同。我不确定您是否认为尺寸/颜色数组在数据库中或在程序中硬编码,但无论哪种方式,该数据都必须存在于某处。

拥有产品变体表应该可以消除一些冗余数据。就像我之前提到的,变体的条形码将被存储一次。使用尺寸/颜色数组,您可能必须为具有该尺寸和颜色的每个项目单独且冗余地存储条形码。我不知道您的要求,但可能还有其他与尺寸和颜色组合相关的数据也必须重复。

我在这里看到的唯一缺点是您将有许多查询必须进行额外的连接。而不是从 stock_item join product 中选择任何内容,而是从 stock_item join product_variation join product 中选择任何内容。但是,如果表被正确索引,并且通过消除冗余日期,每条记录都更短,因此它们在磁盘上占用的块更少,这应该可以减轻损失,这应该不是什么大问题。 (在某些情况下,它实际上可能更快。)

【讨论】:

  • 哇,真是个故事。我想我会选择 2 张桌子。产品表和库存库存表。因为现在我在产品表中以逗号分隔颜色,例如:S、M、L、XL、XXL、XXXL。所以我真的不知道如何用另一张桌子解决这个问题。您将在产品表中为每条记录获得大量记录...
  • 如果 products 表有这个逗号分隔的列表,那么你怎么知道 stock 表中任何给定项目的大小?你在那里重复尺寸吗?如果是这样,那为什么还要在产品表中呢?一般来说,逗号分隔的列表是个坏消息。你会如何查询这个?就像您想知道所有可用的大型产品一样,您将如何编写该查询?您不能调整 WHERE SIZE='L' 的大小,因为大小可能是 'S,L'。你不能说 WHERE SIZE LIKE '%L%' 因为那也会选择 XL、XXL 等。你不能说 SIZE LIKE ',L,' 因为 L 可能是第一个或最后一个。跨度>
  • 我正在考虑删除这样的尺寸/颜色,并将它们与库存一起插入到新数据库中。所以我可以从新表中获取所有内容。
【解决方案2】:

不要在关系数据库的一列中存储多个值 - 这通常被认为是不好的做法。

最好有两个表,一个包含产品名称和产品 ID,另一个用于变体(具有列变体 ID、产品 ID、尺寸、颜色、数量)。变体表中的 product_id 列将是产品表的外键。

【讨论】:

  • variation_id 是 A.I.正确的?但是我不会在该表中仅针对一种产品获得大量记录吗?假设我有 5 种尺寸和 5 种颜色,这意味着我需要在该数据库中为一种产品提供 25 条记录?
  • variation_id 将是一个主键,auto_increment 可能是一个好主意。是的,该表的行数可能比您的产品表多很多。
  • 没关系,有那么多行?不会影响速度或撞车之类的吗?
  • 如果索引正确,应该不会有问题。事实上,它应该更快(无论是在开发时还是在运行时)来完成很多您以后可能想要做的事情。
  • 如果您想显示不同颜色或不同尺寸的列表,则应将这些列标准化为这些属性的代码表。在许多库存数据库中称为 SKU 的变体表应该是产品和所有这些变体之间的交集。适当规范化的数据库在 MySQL 等关系数据库系统中表现得非常好。
猜你喜欢
  • 2023-03-12
  • 1970-01-01
  • 2014-02-12
  • 2023-03-12
  • 2014-04-14
  • 2020-11-18
  • 2022-01-21
  • 2011-09-30
  • 1970-01-01
相关资源
最近更新 更多