多个商店(sId),多个产品(pId)不同的价格。我该如何设计一个高效的数据库

时间:2014-08-24 20:40:25

标签: sql-server database database-design database-schema

现在,我正在设计数据库,因此我没有任何代码。我希望使用sql server,asp.net,如果这是相关的。 我有大量的商店和大量的产品,成千上万。对于相同的pId,价格可能会因sId而异。我会像这样构建它: 1.一个"存储"包含字段的表(sId,名称,位置), 2.一个"产品"包含字段的表(pId,名称大小,类别,子类别)和 3." max(sId)"包含字段的价格表数量(pId,mrp,可用性)。 其中max(sId)是商店的总数。 我宁愿不做" max(pId)"包含字段(sId,mrp,availability)的表的数量,因为我需要为每个商店提供UI,以便他们可以更新各自商店的产品价格和可用性的详细信息。我还需要展示特定商店的一些产品,但我从不需要为任何特定产品展示一些商店。也就是说,不需要按产品搜索商店,但是需要按商店列出商品。 这是一个好方法还是我可以做得更好?

1 个答案:

答案 0 :(得分:1)

您似乎走在正确的轨道上,我会提供一些建议。虽然不需要为任何特定产品显示某些商店,但您应该始终考虑需求将如何变化以及您的系统如何处理。构建您的系统,以便您可以轻松回答这些问题 - 哪些商店的ABC产品价格低于3美元/件?

如您所述,商店表应包含有关商店的信息。认真对待Aaron Bertrand的评论。以下一个开发人员可以读取的方式命名字段并确定它是什么。用户StoreID而不是sID。

StoreID    StoreName       ...other fields
-------    --------------
1          North Chicago
2          East Los Angeles

产品表应包含有关产品的信息。将类别和子类别存储到不同的表中会更好。

ProductID  ProductName     ...other fields
---------  --------------
1          Bread
2          Soap

类别可以位于其自己的表中,具有层次结构。请参阅Hierarchal Data以及如何使用hierarchyid data type。这可能有助于找出每个顶级类别的深度,并帮助管理层决定他们是否过分分类,让每个人都感到悲惨,包括他们在不知不觉中。

多对多ProductCategory表可以将产品链接到类别。还保留历史表。更改产品类别时,请跟踪其内容和设置内容。它可能有助于回答诸如以下问题 - 过去6个月内有多少产品从农业转移到建筑类别?

多对多StoreProductPrice可以将商店和产品结合在一起,并且可以在那里定义价格。还要记住 - 价格也可能因客户而异。有些客户可能会在某个级别获得折扣。虽然这里讨论的内容可能太多,但如果出现支持客户折扣结构的要求,则应将其置于脑海中。

StoreProductID  StoreID  ProductID  Price
--------------  -------  ---------  -----
1               1        1          $4.00
2               1        2          $1.00
3               2        1          $4.05
4               2        2          $1.02

产品的可用性应通过库存管理数据库表完成。例如,您可能拥有Warehouse的主表和Location的主表。把它们放在一起就是WearhouseLocation表。 WarehouseProduct表可以将仓库,产品和单位汇集在一起​​。

或者,您的生产或采购工具可能会将数据转储到ProcuredProduct表中。您的制造单位可能会锁定一部分产品,同时构建一些产品。您的销售部门可能会锁定他们试图销售的产品子集。换句话说,您的产品可能会不断获得分配。您可以运行查询以查找某个产品的可用性,这可能会有点费力。在任何此类分配期间,可以在单个表格中更新可用单位的数量(其中包含您可以轻松依赖的计算可用产品)。

所以......根据客户的需求,您正在构建的系统会变得相当复杂。我建议您考虑这些事情,并使您的数据库结构对预期的更改保持灵活性。规范化是一件好事,去规范化也有其优势。明智地使用它们。