具有捆绑产品的产品的数据库设计

sha*_*ery 15 database-design relations filemaker

我正在为我的零售业务构建一个数据库系统。我设置了一些表格,它们是:

  • 产品
  • 购买
  • 销售量
  • 平衡

所有这些都相互连接,并且能够显示我的库存水平。

我遇到的问题是我还销售捆绑产品 - 其价格与各自的价格不同。
示例:我以 1 美元的价格出售一个橙子,以 1.2 美元的价格出售一个苹果;我以 3.8 美元的价格出售水果套餐 1(2 个橙子和 2 个苹果),以 7 美元的价格出售套餐 2(4 个橙子和 4 个苹果)。

有没有正确的方法来为这些产品包创建关系?

PS:我正在使用 FileMaker Pro 创建这个。

Tod*_*ett 18

您所描述的模式通常称为“零件爆炸”或“物料清单”。它是数据结构研究中图和树部分的一部分。解决方案的本质是认识到任何给定的“产品”都可以由其他“产品”组成。该设计是一个网络结构,其中有一个Product表格,每个产品都有一行 - 无论它是否由其他产品组成,然后是一个Product Component表格,每个产品都有一个由其他产品组成的行,以及作为该产品的组成部分的每个相应产品。在您的情况下,每个产品都有一个价格。所以你会有这样的事情

Product
-----------------------------------
|Name             |Price          |
-----------------------------------
|Orange           |1             |
|Apple            |1.20          |
|Fruit Package    |3.80          |
-----------------------------------

Product Component
----------------------------------------------------------
|Product               |Contains                |Quantity|
----------------------------------------------------------
|Fruit Package         |Orange                  |2       |
|Fruit Package         |Apple                   |2       |
----------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

这种设计比具有递归关联的单个表更可取,因为它清楚地分离了真正的两种实体类型 - 节点和链接。在我们的例子中,产品是节点,产品组件是链接。

虽然网络设计是一个常见的结构,但查询它是有问题的,因为当它完全填充时,它是一个不同深度的递归结构。工业级 DBMS,例如 Oracle 和 SQL Server,具有特殊的语言元素(Oracle 的 CONNECT BY 和 SQL Server 的递归 CTE)来帮助使查询具有声明性。鉴于您使用的是 File Maker Pro,我对此知之甚少,您可能没有此类语言结构来提供帮助,并且可能必须编写过程代码来遍历网络。然而,如果网络的深度是固定的——比如每个产品要么没有组件,要么只有一层组件,这个问题可以得到缓解。以下是有关数据库设计中网络结构的一些参考资料:

  1. 数据库管理中的实际问题- Fabian Pascal。第 7 章提供了我发现的最好和最容易理解的解释。
  2. Joe Celko 在 SQL for Smarties 中的树和层次结构,第二版。这是一本关于特定于 SQL 标准的主题的整本书。
  3. 企业模型模式- David Hay。一本关于所有组织通用的模式的书(不幸的是,ER 图用 UML 呈现,但可以克服)有几个网络结构的例子。