包含颜色和尺寸的库存设计数据库
Inventory design database with colors and sizes
我正计划设计一个库存数据库来跟踪我们店里的商品。我正在考虑在数据库中存储一个包含各种大小和颜色的数组,例如:
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 中将是数组。
不要在关系数据库的一列中存储多个值 - 这通常被认为是不好的做法。
最好有两个 table,一个带有产品名称和产品 ID,另一个用于变体(包含列 variation_id、product_id、尺寸、颜色, 数量)。变体 table 中的 product_id 列将是产品 table.
的外键
正如其他人所说,不要做数组。数组难读、难处理、难查询。
相反,制作 table 颜色和 table 尺寸。
尺码 table 可能只有尺码 ID 和尺码描述。 ID 可以是一个自动递增的整数,比如 1=small,2=medium,3=large,不管你的尺寸是多少。由于尺码通常由短缩写标识,您可以使用缩写作为主键:'S'=small、'M'=medium 等。主键应该很短,但典型的尺码缩写很少会更长超过 4 个字符 -- XXXL --- 在大多数数据库引擎上,它的大小等于或小于整数(整数通常为 4 或 8 个字节)。
同样,颜色 table 将颜色 ID 与颜色名称相关联。同样,ID 可以是一个整数:1=red、2=green、3=orange 等。或者您可以组成简短的缩写。
现在让我们暂时忽略这个问题,退后一步。
您应该有一个产品 table,其中包含有关该产品的各种信息,例如描述、制造商、价格、我使用过的库存系统总是有大量信息,例如产品类别、运输重量、会计准则等等。在一些库存系统中,您只需将每个项目的手头数量存储在产品记录中。也就是说,如果您有 20 个库存小部件,那么在小部件记录中您有一个 "quantity" 字段并存储数字 20。在其他库存系统中,库存中的每个项目都有一条记录,即, 有一个额外的 "inventory" 或 "stock item" table 每个项目有一个记录,如果你有 20 个库存,那么你有 20 个记录。
如果您有库存项目记录,您可以将尺寸和颜色字段——尺寸和颜色 tables 的外键添加到库存项目记录。如果没有与尺寸和颜色组合相关的附加信息,那将是一个很好的答案。
但我猜你的产品上有条形码,至少在 U.S 中是这样,每种尺寸和颜色组合都有不同的条形码。因此,如果您将尺寸和颜色放入库存项目记录中,则必须在每个库存项目记录中重复条形码。重复数据 = 坏。也许您还有其他与尺码和颜色相关的数据。
更好的方法是,如 stwalkerster 所说,创建一条 "product variations" 记录。那么这个记录会有一个指向产品记录的指针,一个指向尺寸记录的指针,以及一个指向颜色记录的指针。它还将具有条形码值和任何其他通用数据。然后库存项目记录将指向产品变体记录而不是产品记录。也就是说,您将有 3 个级别:产品,每个产品都有很多变体,每个变体都有很多库存商品。
如果您不需要单独的库存项目记录,那么您可以将数量存储在产品变化记录中。
您可以将尺寸和颜色信息放在产品记录中,避免需要两个级别。但这几乎肯定会产生大量重复数据。我猜想,如果您有某种款式的衬衫,有各种尺寸和颜色可供选择,那么该衬衫至少必须有描述,"Oxford men's dress shirt with button down color" 或其他任何内容。您不想为每种不同的尺寸和颜色重复该描述。不仅在硬盘驱动器上浪费了很多 space,而且现在您还得担心用户输入的方式略有不同,然后您无法确定 "Oxford men's dress shirt with button down color" 是否与"Dress shirt, Oxford, men's" 或不等。您可能还拥有与将重复的每个产品关联的会计代码等。
您质疑为每个此类变体单独记录是否会占用大量磁盘 space 并降低系统速度。
但想一想:您的库存商品 table 实际上会少 space。没有指向产品记录的指针和 size/color 数组的索引,您将有一个指向产品变体记录的点。少一个字段。
当然,您会有这个额外的 table,产品变体 table。但它的数据量与 size/color 数组的数据量大致相同。我不确定您是否认为 size/color 数组在数据库中或在程序中硬编码,但无论哪种方式,该数据都必须存在于某个地方。
具有产品变体 table 应该会消除一些冗余数据。就像我之前提到的,变化的条形码将被存储一次。使用 size/color 数组,您可能必须为每个具有该尺寸和颜色的项目单独和冗余地存储条形码。我不知道您的要求,但可能还有其他与尺寸和颜色组合相关的数据也必须重复。
我在这里看到的唯一缺点是您将有许多查询必须进行额外的连接。而不是 select whatever from stock_item join product 你会有 select whatever from stock_item join product_variation join product。但如果 table 被正确索引,那应该没什么大不了的,并且通过消除冗余日期,每条记录都更短,所以它们在磁盘上占用的块更少,这应该可以减轻损失。 (在某些情况下,它实际上可能更快。)
我正计划设计一个库存数据库来跟踪我们店里的商品。我正在考虑在数据库中存储一个包含各种大小和颜色的数组,例如:
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 中将是数组。
不要在关系数据库的一列中存储多个值 - 这通常被认为是不好的做法。
最好有两个 table,一个带有产品名称和产品 ID,另一个用于变体(包含列 variation_id、product_id、尺寸、颜色, 数量)。变体 table 中的 product_id 列将是产品 table.
的外键正如其他人所说,不要做数组。数组难读、难处理、难查询。
相反,制作 table 颜色和 table 尺寸。
尺码 table 可能只有尺码 ID 和尺码描述。 ID 可以是一个自动递增的整数,比如 1=small,2=medium,3=large,不管你的尺寸是多少。由于尺码通常由短缩写标识,您可以使用缩写作为主键:'S'=small、'M'=medium 等。主键应该很短,但典型的尺码缩写很少会更长超过 4 个字符 -- XXXL --- 在大多数数据库引擎上,它的大小等于或小于整数(整数通常为 4 或 8 个字节)。
同样,颜色 table 将颜色 ID 与颜色名称相关联。同样,ID 可以是一个整数:1=red、2=green、3=orange 等。或者您可以组成简短的缩写。
现在让我们暂时忽略这个问题,退后一步。
您应该有一个产品 table,其中包含有关该产品的各种信息,例如描述、制造商、价格、我使用过的库存系统总是有大量信息,例如产品类别、运输重量、会计准则等等。在一些库存系统中,您只需将每个项目的手头数量存储在产品记录中。也就是说,如果您有 20 个库存小部件,那么在小部件记录中您有一个 "quantity" 字段并存储数字 20。在其他库存系统中,库存中的每个项目都有一条记录,即, 有一个额外的 "inventory" 或 "stock item" table 每个项目有一个记录,如果你有 20 个库存,那么你有 20 个记录。
如果您有库存项目记录,您可以将尺寸和颜色字段——尺寸和颜色 tables 的外键添加到库存项目记录。如果没有与尺寸和颜色组合相关的附加信息,那将是一个很好的答案。
但我猜你的产品上有条形码,至少在 U.S 中是这样,每种尺寸和颜色组合都有不同的条形码。因此,如果您将尺寸和颜色放入库存项目记录中,则必须在每个库存项目记录中重复条形码。重复数据 = 坏。也许您还有其他与尺码和颜色相关的数据。
更好的方法是,如 stwalkerster 所说,创建一条 "product variations" 记录。那么这个记录会有一个指向产品记录的指针,一个指向尺寸记录的指针,以及一个指向颜色记录的指针。它还将具有条形码值和任何其他通用数据。然后库存项目记录将指向产品变体记录而不是产品记录。也就是说,您将有 3 个级别:产品,每个产品都有很多变体,每个变体都有很多库存商品。
如果您不需要单独的库存项目记录,那么您可以将数量存储在产品变化记录中。
您可以将尺寸和颜色信息放在产品记录中,避免需要两个级别。但这几乎肯定会产生大量重复数据。我猜想,如果您有某种款式的衬衫,有各种尺寸和颜色可供选择,那么该衬衫至少必须有描述,"Oxford men's dress shirt with button down color" 或其他任何内容。您不想为每种不同的尺寸和颜色重复该描述。不仅在硬盘驱动器上浪费了很多 space,而且现在您还得担心用户输入的方式略有不同,然后您无法确定 "Oxford men's dress shirt with button down color" 是否与"Dress shirt, Oxford, men's" 或不等。您可能还拥有与将重复的每个产品关联的会计代码等。
您质疑为每个此类变体单独记录是否会占用大量磁盘 space 并降低系统速度。
但想一想:您的库存商品 table 实际上会少 space。没有指向产品记录的指针和 size/color 数组的索引,您将有一个指向产品变体记录的点。少一个字段。
当然,您会有这个额外的 table,产品变体 table。但它的数据量与 size/color 数组的数据量大致相同。我不确定您是否认为 size/color 数组在数据库中或在程序中硬编码,但无论哪种方式,该数据都必须存在于某个地方。
具有产品变体 table 应该会消除一些冗余数据。就像我之前提到的,变化的条形码将被存储一次。使用 size/color 数组,您可能必须为每个具有该尺寸和颜色的项目单独和冗余地存储条形码。我不知道您的要求,但可能还有其他与尺寸和颜色组合相关的数据也必须重复。
我在这里看到的唯一缺点是您将有许多查询必须进行额外的连接。而不是 select whatever from stock_item join product 你会有 select whatever from stock_item join product_variation join product。但如果 table 被正确索引,那应该没什么大不了的,并且通过消除冗余日期,每条记录都更短,所以它们在磁盘上占用的块更少,这应该可以减轻损失。 (在某些情况下,它实际上可能更快。)