构建数据库,其中产品具有来自多个供应商的多种包装类型

时间:2009-02-24 16:13:03

标签: database-design architecture

假设我有一个Products表格,并且有一个“默认”单位产品的销售(EA让我们说,单独)。某些供应商也提供该产品BX(方框)和CT(纸箱),每个产品都包含一定数量的“默认”单位(在我们的例子中,假设一个方框是6和纸箱是12)。

产品具有与“默认”单位关联的常规定价,然后是每个其他销售单位的另一个定价。产品的成本(即我们作为卖方支付的费用)因每个供应商的产品而异,我们打算实施一种方法来查看销售产品的供应商列表,以便我们选择最优惠的价格(例如我们可能会选择供应商) A为个别产品,但供应商B为纸箱,因为他们以比卖方A便宜的价格将它卖给我们。

业务规则要求我们在每个包装级别为产品维护单独的SKU,但其余信息(例如销售副本,制造商,描述)是相同的。因此,给定具有SKU ACM1234的产品,它可以具有“可显示的”SKU:

ACM1234 - Individual product (default) with List Price $5.00
ACM1234BX - Box packaging (6 individual) with List Price $28.00
ACM1234CT - Carton packaging (12 individual) with List Price $50.00

并且该产品可能由3个不同级别的供应商提供 - 其中一些可能不提供纸盒版本,但提供盒子和单个,而其他可能有三个。

此外,由于我们的主要客户是美国政府,我们有“合同”和“非合同”项目的概念,因此需要将产品视为一个单独的实体;例如,我们可能只选择将产品的盒装和纸盒版本出售给政府,而不是单一产品。当我们收到订单时,我们需要通过它的SKU(例如ACM1234BX)查找项目并获取它的信息 - 例如我们正在销售的信息。如果产品数据库具有“常规”SKU(例如,单个项目)但政府客户购买了盒子版本,则可能会遇到问题。

通常我会有一个“主”产品表,其中包含SKU和其他相关信息,如描述。但是,在这种情况下,创建模式来处理这个问题的最佳方法是什么?我可以做一些查找表,并在一个表中列出“常见”信息(销售副本,描述,它是回收利用等),并将其链接到另一个表,列出产品及其包装级别以及具有显示的SKU的“计算”列。也许是这样的:

# Products table
id    description             recycled   sales copy
1     ACME(R) Widget Plus     1          The only Widget you will ever need...

# Packaging table
product_id        unit          selling_sku    list_price
1                 EA            ACM1234        5.00
1                 CT            ACM1234CT      50.00
1                 BX            ACM1234BX      28.00

但是,我担心在查找或添加新产品时,这将变得非常复杂和笨拙。我们收到产品供稿的供应商包含所有相关信息的单一表格,并且不假设您销售多种包装类型的产品(仅限主要类型)。他们还提供自己的人工ID,将所有内容联系在一起。我想这样做的另一种方式是在Products表中有一行对应于常规产品实体(例如单个),然后将相关表与该产品的其他包级别相对应,并在UI上(我没有'考虑到我正在尝试构建一个合适的数据模型,我做了一个“自动建议”类型的交易,如果你键入ACM1234,它将显示与BX和CT变体一起,你可以选择一个你想要并获得由它填充的适当值。

我觉得我走在正确的轨道上,但我仍然认为我错过了一些东西,而且我的头脑开始转向尝试在精神上运行所有这些潜在的场景,以提出可扩展的解决方案。它需要能够容纳可以单独销售的产品,盒子以及来自不同供应商的不同价格水平的纸箱。

有任何建议或想法吗?

编辑:我使用SQL Server 2005 Standard作为数据库。

编辑(02/25/2009):因此,请遵循awithrowDavid Aldridge的建议:

# Products
id          base_sku          ...
1           ACM1234

# Vendors
id          name
1           United Supply Co.
2           ACME Office Supply

# ProductsPackages
id          productID          unit          listPrice
1           1                  EA            5.00               
2           1                  BX            15.00
3           1                  CT            40.00

# VendorsProductsPackages
vendorID          packageID          cost          
1                 1                  3.45          
1                 2                  7.85
1                 3                  14.86
2                 2                  10.45

可能会创建一个表格,其中包含每种类型单位的SKU后缀映射,以防我们添加更多内容。

2 个答案:

答案 0 :(得分:2)

听起来我觉得你需要下面的表格:

  • 产品:基础产品本身
  • Product_Package:它所包含的包
  • 供应商:供应商的完整列表
  • Product_Package_Vendor:将供应商与其提供的产品包相关联的交叉点

答案 1 :(得分:1)

听起来你是在正确的轨道上,但看起来你的桌子需要更多分解。我将如何做到这一点:

与您的产品类似的产品表:

Products table

id    description             recycled  base_SKU     sales_copy
1     ACME(R) Widget Plus     1         ACM1243      The only Widget you will ever need...

包装表

Packaging table:

id     unit     SKU_suffix
1      EA       ''
2      CT       'CT'
3      BX       'BX'

最后是与这两者相关的第三个表:

Packaged Product Table

id     product_id     package_id     price
1      1              1              $5
2      1              2              $50
3      1              3              $28

现在您可以从第三个表中进行选择,并使用base_SKU和SKU_suffix来创建“最终”SKU。这取决于您使用的数据库引擎。这种理想可以防止您将相同的信息复制到多个表中。

您还提到向不同的客户展示不同的包裹,即不向政府出售个别物品。您可以创建另一个名为“catalogs”的表或类似的东西,将打包的产品ID映射到客户ID。然后,您可以向客户发送自定义目录。你也可以通过做类似的事情来为政府生成一个目录:

SELECT <fields> from Packaged_Products WHERE package_id != 1

再次,这将取决于您的数据库

希望这会有所帮助