这个图有冗余吗?
Does this diagram have redundancy?
我对数据冗余有疑问。
我有下图:
包裹存放在仓库中。包裹可以从一个仓库转移到另一个仓库。我想存储有关包裹在特定日期(在哪个仓库中)所在位置的信息以及有关仓库之间运输的信息。
运输多个包裹从一个仓库出发,到达不同的仓库。
包裹只能在某个仓库一次(如果运输到另一个仓库,则不能随时返回到以前的仓库。)
我想到了这个:
第二张图是正确的还是有冗余?
编辑:
我将 Deliveries 更改为 Packages 因为我的意图是 Delivery 是一件不可分割的东西(比如盒子或信件)- 对不起混乱,这是一个坏名字。
因此,基于@philipxy 的回答,我认为这张图更适合我想要实现的目标。我删除了 DateStorage,并将 inital warehouse 属性 添加到 Packages。
您似乎以两种不同的方式使用 "delivery":一些东西,以及最初(或最近?)存储在特定仓库(仅与一个日期相关联?)的一部分东西。那么一个部件(每个部件都可以通过初始存储交付仓库对识别?)可能已经从它所在的地方被多次运输到不同的仓库。 transpord 后一次交货可以在同一仓库中有两个零件吗?一个零件可以在同一天运输两次吗?一次运输可以到同一个仓库吗?
您的问题对应用程序 tables/relationships 和约束的描述不明确;但似乎您可能需要一个答案来建议您如何在问题变得清晰之前继续进行。
您似乎对以下内容感兴趣。 (我不声称它与您问题中的所有内容一致;但您问题中的所有内容也不一致。)使用 ER,对于每个基本实体类型和感兴趣的关系类型,我们都会给出一个 predicate确定其 table 的行 -- 由列名参数化的填空句模板。
-- 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。例如,您可以从 Transport 中删除 fid,因为您可以从它的 did 及其传输链中重建它。例如,如果您只关心零件现在在哪里,则不需要此存储。例如,您可能需要初始存储、传输以及部件现在所在的位置(本质上,部件实体 table),即使您可以从前者导出后者。
例如,如果一次交货每个仓库只能有一个零件,那么您也可以通过其当前仓库识别一个零件,因此您可以:
-- 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
在任一设计中,零件的交付加上其运输链起点处的仓库必须在存储中形成一对。
我对数据冗余有疑问。
我有下图:
包裹存放在仓库中。包裹可以从一个仓库转移到另一个仓库。我想存储有关包裹在特定日期(在哪个仓库中)所在位置的信息以及有关仓库之间运输的信息。 运输多个包裹从一个仓库出发,到达不同的仓库。 包裹只能在某个仓库一次(如果运输到另一个仓库,则不能随时返回到以前的仓库。)
我想到了这个:
第二张图是正确的还是有冗余?
编辑:
我将 Deliveries 更改为 Packages 因为我的意图是 Delivery 是一件不可分割的东西(比如盒子或信件)- 对不起混乱,这是一个坏名字。 因此,基于@philipxy 的回答,我认为这张图更适合我想要实现的目标。我删除了 DateStorage,并将 inital warehouse 属性 添加到 Packages。
您似乎以两种不同的方式使用 "delivery":一些东西,以及最初(或最近?)存储在特定仓库(仅与一个日期相关联?)的一部分东西。那么一个部件(每个部件都可以通过初始存储交付仓库对识别?)可能已经从它所在的地方被多次运输到不同的仓库。 transpord 后一次交货可以在同一仓库中有两个零件吗?一个零件可以在同一天运输两次吗?一次运输可以到同一个仓库吗?
您的问题对应用程序 tables/relationships 和约束的描述不明确;但似乎您可能需要一个答案来建议您如何在问题变得清晰之前继续进行。
您似乎对以下内容感兴趣。 (我不声称它与您问题中的所有内容一致;但您问题中的所有内容也不一致。)使用 ER,对于每个基本实体类型和感兴趣的关系类型,我们都会给出一个 predicate确定其 table 的行 -- 由列名参数化的填空句模板。
-- 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。例如,您可以从 Transport 中删除 fid,因为您可以从它的 did 及其传输链中重建它。例如,如果您只关心零件现在在哪里,则不需要此存储。例如,您可能需要初始存储、传输以及部件现在所在的位置(本质上,部件实体 table),即使您可以从前者导出后者。
例如,如果一次交货每个仓库只能有一个零件,那么您也可以通过其当前仓库识别一个零件,因此您可以:
-- 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
在任一设计中,零件的交付加上其运输链起点处的仓库必须在存储中形成一对。