Sql ER图-显示向办公室及其分支机构交付的货物

Sql ER图-显示向办公室及其分支机构交付的货物,sql,entity-relationship,erd,Sql,Entity Relationship,Erd,对于一个小项目,我正在为一个简单的股票跟踪应用程序创建一个实体关系图 用户故事 产品由产品供应商销售。产品由办公室订购并交付给他们。可能需要一次或多次交货才能完全完成订单。该办公室订购的这些产品依次交付给各分公司。是否有一种通用的方式,我可以表示办公室将如何向其负责的分支机构分配股票 ER图 下面是一个非常简单的图表,描述了上述内容 送货将被送到办公室,然后依次送到分支机构。作为总部子部门的每个部门(图中未显示)都有不同数量的库存,不一定与订单详细信息一一对应。问题是如何在给定当前模式的情况下

对于一个小项目,我正在为一个简单的股票跟踪应用程序创建一个实体关系图

用户故事

产品由产品供应商销售。产品由办公室订购并交付给他们。可能需要一次或多次交货才能完全完成订单。该办公室订购的这些产品依次交付给各分公司。是否有一种通用的方式,我可以表示办公室将如何向其负责的分支机构分配股票

ER图

下面是一个非常简单的图表,描述了上述内容

送货将被送到办公室,然后依次送到分支机构。作为总部子部门的每个部门(图中未显示)都有不同数量的库存,不一定与订单详细信息一一对应。问题是如何在给定当前模式的情况下显示各个部门的库存,或者如何以更容易显示的方式修改库存


更新:启动了bounty并创建了新的ERD图。

这是一个有点奇怪的结构。通常情况下,我处理这个问题的方法不是使用这里的菊花链结构,而是使用某种基于事务的系统

我处理它的方法是把所有的东西都从
顺序中去掉,并且
从中去掉一对多的关系

例如,我确实看到您在
Order
中禁用了
OrderDetail
,但是这始终是
Order
的子集。所有订单都会有细节;我将链接主
OrderDelivery
表的
OrderDelivery
链接,并使详细信息在任何时候都可以作为参考表访问,而不是关闭
OrderDetailDelivery

我会将
Office
作为
OrderDelivery
上的一个字段,并以这种方式使用
Branch
。如果您想为它们创建单独的表,这很好,但我会使用
OrderDelivery
作为这些表的中心位置。
null
可以指示它是否已交付,然后您可以使用应用程序层来处理流程的顺序

换言之,
OfficeID
BranchID
可以作为字段存在,以指示
OrderDelivery

编辑 由于设计发生了一些变化(看起来确实更好),我想指出的一点是,
supplier
的元数据与
Delivery
相同<代码>供应商
对我来说就像一个实体,而
交付
是一个过程。我认为,
供应商
可以作为一个参考表单独使用。换句话说,您不需要在此表中包含所有相同的元数据;相反,您可能希望创建一个表(很像您现在为
供应商
)创建的表,而不是名为
供应商交货

我看到的要点是,您希望能够通过所有检查点跟踪各种产品订单的所有部分。考虑到这一点,您可能不一定要为此设置单独的实体,而是将类似于
SupplierDate
的内容作为
Delivery
上的一个字段进行跟踪。无论哪种方式,我都不会在结构上太过纠结;您的应用程序层将处理大量这类问题

有一件事我会非常小心:如果多个表的字段名称相同,但不是相互引用的键,那么您可能希望创建不同的名称。例如,如果供应商上的
deliveryDate
Delivery
上的同一个键不同,您可能想将其称为
shipDate
之类的名称,或者如果您指的是它到达供应商的日期,
supplierDeliveryDate
,否则您可能会在将来的查询中混淆自己,如果没有大量注释,代码将很难解析

编辑以包含图表[再次编辑以获得更好的图表]: 下面是我将如何处理它。您的重做图非常接近,但这里有一些变化

我的解释是:

最简单的方法是先用不同的实体设置它们,然后再设置它们之间的关系,并确定是否需要一个链接表

不同的实体如下所述:

  • 订单
  • 产品
  • 供应商
  • 分支机构
总部,虽然我将其包括在内,但实际上并不是图表中必要的组成部分;据推测,命令和请求是在这里发出的,但我的理解是,命令在任何时候都不会通过总部;它更像是一个中央处理区。我收集的产品不经过总部,而是直接进入分支机构。如果他们这样做了(这可能会减慢交付过程,但这取决于您),您可以用它替换Branch,并像以前一样将Branch作为它的链接。否则,我认为您可以完全从图表中删除它

链接表

这些是为出现的多对多关系而设置的

  • OrderProductDetail-订单可以有许多产品,而且许多订单可以有相同的产品。每个主键组合可以与每个订单的多个产品相关联[编辑:见下文,现在通过SupplierProduct将订单、产品和供应商联系在一起]。因为这是一个链接表,所以每个订单可以有任意数量的产品
  • 供应商产品-假设同一产品有多个供应商,
    Suppliers(SupplierId) where SupplierId is PK
    Products(ProductId) where ProductId is PK
    HeadQuarters(HeadQuarterId) where HeadQuarterId is PK
    Branches(BranchId, HeadQuarterId) where BranchId is PK and HeadQuarterId references HeadQuarters
    Orders(OrderId, OrderDate, SupplierId) where OrderId is PK and SupplierId references Suppliers
    Deliveries(OrderId, DeliveryNumber, DeliveryDate, BranchId) where (OrderId, DeliveryNumber) is PK, OrderId references Orders and BranchId referenced Branches
    DeliveriedProducts(OrderId, DeliveryNumber, ProductId, ProductQuantity) where (OrderId, DeliveryNumber, ProductId) is PK, (OrderId, DeliveryNumber) references Deliveries and ProductId references Products
    
    select HeadQuarterId, BranchId, SupplierId, OrderDate, OrderId, DeliveryNumber, DeliveryDate, ProductId, ProductQuantity
    from Branches
        join Deliveries using (BranchId)
        join Orders using (OrderId)
    
                             JOIN Supplier
                           /                             
    SELECT * FROM Delivery JOIN OrderDetailDelivery
                 JOIN OrderDetail JOIN Product
                                  \ 
                                   JOIN Order JOIN Branch JOIN HQ