我对数据冗余有疑问。
包裹存储在仓库中。包可以从一个仓库移动到另一个仓库。我想存储有关特定日期(在哪个仓库中)包裹的位置以及有关仓库之间的运输的信息。 运输从一个仓库出发,有多个包裹,到达不同的仓库。 包裹只能在某个仓库中运送一次(如果运输到另一个仓库,则不能随时返回到以前的仓库。)
我想出了这个:
第二个图表是正确的还是有冗余?
我将交付更改为 Packages ,因为我的意图是交付是一个不可分割的东西(如盒子或信件) - 抱歉混淆,这是一个坏名字。 所以基于@philipxy答案,我认为这个图表更适合我想要实现的目标。我删除了 DateStorage ,并将 inital warehouse 属性添加到 Packages 。
答案 0 :(得分:1)
您似乎以两种不同的方式使用“交付”:某些东西,以及最初(或最近?)存储在特定仓库中的部分内容(仅与一个日期相关联?)。然后,一个部件(每个可由初始存储交付 - 仓库对识别?)可能已经从其所在地运送到不同的仓库任意次。在交货后,交货可以在同一个仓库中有两个部分吗?零件可以在同一天运输两次吗?运输可以到同一个仓库吗?
您的问题对您的应用程序表格/关系和约束的描述尚不清楚;但似乎你可能需要一个答案,建议你如何能够在它变得清晰之前继续前进。
您似乎对以下内容感兴趣。 (我并不认为它与你问题中的所有内容一致;但你问题中的一切都不一致。)使用ER,对于每个基本实体类型&感兴趣的关系类型我们给谓词确定其表的行 - 按列名参数化的填空句子模板。
-- DID ids a delivery
Delivery(did)
-- WID ids a warehouse
Warehouse(wid)
-- a delivery DID part was initially stored at warehouse WID on date D
storage(did,wid,d)
key {did, wid}
FK (did) to delivery, (wid) to warehouse
-- part DID-WID was transported from warehouse FID to warehouse TID on date D
Transport(did, wid, fid, tid, d)
key {did, wid, fid, d}, {did, wid, tid, d}
FK (did, wid) to storage, (fid) & (tid) to warehouse
这可能会也可能不会捕获您的应用情况的状态和限制。
但是,假设这与您的应用程序一致,则它不一定是您想要的设计的一部分。 (尽管你可以根据它来表达你想要的设计。)
例如,如果某个零件每个日期只能运输一次,那么您在传输密钥中不需要日期d。例如,你可以从传输中删除fid,因为你可以从它的传输和重建中重建它。它的运输链。例如,如果您只关心现在零件的位置,则不需要此存储。例如,您可能需要初始存储,传输以及零件现在的位置(基本上是零件实体表),即使您可以从前者派生后者。
例如,如果交货每个仓库只能有一个零件,那么您也可以通过当前仓库识别零件,这样您就可以:
-- same predicate as Transport
-- part DID-WID was transported from warehouse FID to warehouse TID on date D
Transport2(did, fid, tid, d)
key {did, fid, d}, {did, tid, d}
FK (did) to delivery, (fid) & (tid) to warehouse
在任何一种设计中,零件的交货加上其运输链开始处的仓库必须在仓库中形成一对。