对于一个小项目,我正在为一个简单的股票跟踪应用程序创建一个实体关系图。
用户故事
产品由产品供应商销售。产品由办公室订购并交付给他们。可能需要一次或多次交货才能完成订单。该办事处订购的这些产品依次交付给各个分支机构。有没有一种通用的方法可以代表办公室如何将库存分配到它负责的分支机构?
ER图
这是描述上述内容的非常简化的图表。
交付将交付给办公室,然后交付给分支机构。作为 HeadQuarters 的子部门(图中未显示)的每个部门都有不同数量的库存,它们不一定与 OrdersDetail 一一对应。问题是如何在给定当前模式的情况下显示各个部门的库存,或者以更容易显示的方式对其进行修改。
更新:开始赏金并创建新的 ERD 图。
最佳答案
这有点奇怪的结构。通常我处理这个问题的方式不会是你这里的菊花链结构,而是会使用某种基于事务的系统。
我处理它的方法是把所有东西都关掉 order
, 和 have one-to-many
关系关闭。
例如,我确实看到你有 OrderDetail
关闭 Order
,但是这将始终是 Order
的子集.所有订单都会有详细信息;我会链接 OrderDelivery
关主Order
表,并在任何时候都可以访问详细信息作为它的引用表而不是 OrderDetailDelivery
.
我有 Office
作为 OrderDelivery
上的字段并使用 Branch
也是这样。如果您想为它们设置单独的表,那很好,但我会使用 OrderDelivery
作为这些的中心位置。一个 null
可以指示它是否已交付,然后您可以使用您的应用程序层来处理流程的顺序。
换句话说,OfficeID
和 BranchID
可以作为字段存在以指示其各自表的外键 OrderDelivery
编辑
由于设计有所改变(而且看起来确实更好),我想指出的一件事是您有 supplier
具有与 Delivery
相同的元数据. Supplier
对我来说听起来像一个实体,而 Delivery
是一个过程。我认为 Supplier
作为引用表,它本身可能会很好地生活。换句话说,您不需要在该表中包含所有相同的元数据;相反,您可能想要创建一个表(很像您现在为 supplier
所做的那样),而是调用 SupplierDelivery
.
我看到的一点是,您希望能够通过其所有检查点跟踪各种产品的订单的所有部分。考虑到这一点,您可能不一定希望为此拥有一个单独的实体,而是跟踪类似 SupplierDate
的内容。作为 Delivery
上的字段之一.无论哪种方式,我都不会太执着于结构;您的应用程序层将处理大量此类事务。
我会非常小心的一件事:如果多个表具有相同名称的字段,但不是相互引用的键,您可能希望创建不同的名称。例如,如果 deliveryDate
供应商上的与 Delivery
上的相同键不同,你可能想考虑把它叫做 shipDate
或者,如果您指的是到达供应商的日期,supplierDeliveryDate
否则,您将来可能会因查询而混淆自己,并且会使您的代码在没有大量注释的情况下极难解析。
编辑以包含图表 [再次编辑以获得更好的图表]:
下面是我将如何处理它。你的重做图非常接近,但这里有一些变化
我的解释:
最简单的方法是先设置不同的实体,然后再设置它们的关系,然后确定是否需要链接表。
不同的实体如下所述:
总部 ,虽然我包含了它,但实际上并不是图表的必要组成部分;大概订单和请求是在这里发出的,但我的理解是订单在任何时候都不会流经总部;它更像是一个中央处理区。我收集的产品不通过总部,而是直接到分支机构。如果他们这样做(这可能会减慢交付过程,但这取决于您),您可以用它替换 Branch,并像以前一样将 branch 作为它的链接。否则,我认为您可以安全地将其从图表中完全删除。
链接表
这些是为出现的多对多关系而设置的。
总结一下,供应商产品包含供应商和产品的组合,然后传递给 订购产品详情 它将这些与订单的详细信息结合起来。这张 table 基本上完成了大部分工作,在它通过交付到分支机构之前将所有东西放在一起。
注:上次编辑:将供应商 id 添加到 OrderProductDetail 并从供应商产品切换到供应商 ID 和产品 ID 的双主键,以确保您有一种更清晰的方法来确保您可以在产品从供应商到 OrderProductDetail 的方式上足够细化。
我希望这会有所帮助。
关于sql - ER 图 - 显示到办公室及其分支机构的交付,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29581163/