我们公司生产鞋子,因此我承担了制作FE&BE的任务。我决定暂时在MS Access中制作FE(一旦我熟悉和熟悉它,极有可能在1-2年内切换到Django Web应用程序),BE现在在MySQL中。

基本上,我们的客户可以订购一些产品,例如在单独的盒子中(每个对都有一个盒子)订购“ shoeA” x 1080,并在纸箱中订购24个这样的盒子。因此,物料清单(或装配体……此处不确定术语)的结构如下所示:

Order1
    - Carton (size 24) x 45
        - Box (1 pair) x 24     -- (45 * 24 = 1080)
            - Packing paper x 1
            - shoeA x 1
    ...


但是,如果我们看一下shoeA的组成成分,那就是更多的副产品和原材料。此外,每件物品可以来自不同的地方(例如仓库),并且可以通过不同的组装方式进行组装(例如,鞋类A与包装时不会通过同一组装方式进行组装)。问题是,多个装配件执行相同类型的工作(例如,多个包装装配件),因此我们不知道在订购时哪个装配件会执行什么操作(例如,订单可以提前6个月到达,我们将知道哪个程序集将提前2个月执行操作)。

更复杂的是,即使两个``类型''的组件(例如包装组件)产生相同的结果,也可能需要不同的材料。例如,我们在土耳其的组装只需要我们提供的shoeA,他们将自己提供其余的材料/副产品(例如盒子/包装纸等)。当然,这将反映在价格中,但这不是现在的问题。关键是这两个组件最终都将生产相同的产品(例如,其中装有鞋子和纸的盒子)。

在后端RDBMS中如何体现这一点?目前我有:

mysql - 具有装配和产品层次结构的制造的数据库(BE)设计-LMLPHP

请忽略属性本身(而不是PK / FK),因为它们只是占位符,直到我完成事情为止。

最佳答案

我认为您会遇到的最大问题是子装配的可能性。即您可能将三个零件组装成一个组件,而该组装件再加上另外两个零件就制成了鞋子。

我通常看到的处理方式是这样的:

 CREATE TABLE part (
     id int autoincrement,
     is_assembly tinyint,
     ...
 );
 CREATE TABLE component (
     assembly_id int references part(id),
     component_id int references part(id),
     qty numeric, -- number used to make assembly
     equivalent_to int references part(id)
 );


请注意,这种结构允许您无限嵌套装配件。

然后可以通过添加equal_to部分来解决等价问题,该部分允许您处理。

请注意,您需要分别跟踪每个零件和子零件的进出,因为不再需要在零件输入和零件装配之间进行1:1映射。

09-25 20:10