如何在数据库图中对 Letter Transportation 业务上下文进行建模?

Igo*_*gor 7 erd database-design database-diagrams

我正在尝试为运输公司数据库创建实体关系图。该数据库应存储有关信件交付、将信件从一个仓库转移到另一个仓库以及历史信息的信息。它应该允许跟踪信件,例如,检查特定仓库中特定日期的信件

我要建模的过程如下所示:

  • 信件从发件人处收集并进入仓库
  • 然后它可以在仓库之间转移,
  • 最后,信件交付收件人

商业规则

  • 信件是通过发送和接收的人,一个字母可以通过一个特定的发送通过特定的,并且也收到了
  • 数据库中可以有很多,如果一个存储在数据库中,它必须是某个信件的发送者接收者
  • 运输在不同仓库之间进行,必须由许多信件组成,信件可以是多个运输的一部分(在不同的日期
  • 仓库存储多个信件
  • 可被存储在几个不同的仓库上的不同日期(上'01 0.11'是在‘仓库A’,并在'02 0.11'在‘仓库B’)
  • DateStorage - 包含有关信件何时到达某个仓库的信息
  • 运输在某个日期完成,他们从一个仓库出发去另一个仓库
  • 信件可以投递给收件人。如果交付尝试失败 - 可能会有更多尝试。

电流图

这是我迄今为止创建的数据库图:

![图表

信件仓库之间的关系是指当信件被快递员提取时,它会被放入该仓库。

问题和当前考虑

这个图是否正确,我可以改进什么?

运输和仓库之间是否存在关系(从以前的运输和信函的初始仓库可以推断出)?

MDC*_*CCL 7

虽然你你图中所示的结构是一个大学项目的一部分,其目的应该是让它尽可能的真实,所以我认为,开展了的专家接受记者采访时(或系列访谈)对应公司可能会非常有帮助(也许是必不可少的)。

这样,由于为此类业务领域创建完整且准确的实体关系图(或其任何衍生图)将需要更深入的检查(因此,需要进行非常长的一系列调整和fro-ings),这个答案的目的是为你指出你可能必须采用的技术方法的正确方向,提出一个说明性分析,其中包括我的 IDEF1X 模型的初稿,该模型由看起来可行的元素组成,以便您可以将其用作参考来捕捉真实场景的含义。

核心方面

我看到它的方式,业务领域分析,需要特别注意的方面是事件,其中可能参与; 因此,我将在下面详细说明一个假设上下文,其中包含一些看似相关的假设事件类型(但是,自然而然,您应该自己确认、修改或丢弃所有讨论的点)。

注意事项

我列出了我认为对转发情况特别有帮助的元素(在我们通过 chat 的谈话中提出):

  • [A]任何时候,我都想知道这封信在哪里——不管它是在某个仓库里还是正在运输中。
  • 在我的设计中,发件人只是一封信的原始发件人(公司的客户),而收件人(收件人)是一个收信人 - 一封信总是有一个发件人和一个收件人。
  • [F] 或一种运输只能有一种快递。
  • 一封信最多可存放10个左右的仓库。然而,所有仓库的数量要高得多——几百个(甚至几千个)。
  • 我的想法是将每个客户端(发件人/收件人)存储在数据库中。因此,如果某人发送或接收了至少一封信,它 [...] 在数据库中(但如果某人发送/接收更多信件,则它仅在数据库中一次)。

商业规则

然后,基于 (a) 这些元素,(b) 你的问题的内容,以及 (c) 一些看起来可行的估计和假设,我写了以下公式来描述假设实体类型之间的初步相互关系(即,业务上下文规则的重要组成部分,用于定义相应的概念模型):

人、信和地址

  • 一个字母正好由一个发送(谁扮演的角色发件人
  • 一个发送零一或多封信
  • 一个地址只有一个(谁执行的角色收件人
  • 一个(执行的作用收件人)在零一或一对多寻址快报
  • 一个保持零一个或多个地址
  • 一个地址由零一或一对多的保持
  • 一个地址所在的发件人零一或一对多快报
  • 一个地址定位到收件人的零一或一对多快报

信件和事件

  • 涉及一个一对多活动
  • 一个事件仅按一种EventType分类
  • 一个事件
    • 要么是Dispatch 1
    • 出口2
    • 运输3
    • HalfwayStorage 4
    • DeliveryAttempt 5
    • 接收6

1 调度。当某个人将特定的信件留在精确的仓库中以便它可以参与运输过程时发生的事件

2 退出。当特定信件离开给定仓库开始运输时发生的事件

3 运输。特定信件在运输过程中在不同仓库之间移动时发生的事件

4 中途存储。在运输途中将具体的信件保存在确切的仓库中时发生的事件

5 交付尝试。当某个人(扮演快递员的角色)试图将特定的信件发送给其中提到的时发生的事件

6 接收。当地址中收到某封信时发生的事件,该地址可定位在该中提及的

注意:其中一些类型的事件(或事件类型)可能会针对某个字母出现多次(例如,在整个运输过程中,一个字母可能涉及多个运输事件);其他类型的事件似乎仅限于关于具体运输过程的独特事件(例如,调度接收)。另一方面,一个真正的业务领域可能需要更多的事件类型,并且本答案中讨论的那些可能根本不适用或可能具有不同的特征,这就是为什么自己执行分析是最重要的。此外,我在这里使用的术语只是解释性的,因为它们可能与实际组织中使用的术语不同。

Warehouse 和 Event 的不同子类型:Dispatch、Exit 和 HalfwayStorage

  • 一个仓库递交零一或一对多急件
  • 一个仓库是零一或一对多的起源退出
  • 一个仓库是零一或一对多的目的地退出
  • 一个仓库提供零一或多的HalfwayStorages

车辆和事件的不同子类型:Exit、Transport 和 DeliveryAttempt

  • VEHICULE被用在零一或一对多退出
  • VEHICULE采用在零一或一对多的Transport
  • VEHICULE在零一或一对多使用DeliveryAttempts

Person 和事件的子类型:Transport、DeliveryAttempt 和 Receiving

  • 一个(扮演Courier的角色)携带零一或多交通工具
  • 一个(扮演Courier的角色)传达零个或多个DeliveryAttempts
  • 一个(扮演Courier的角色)参与零一或多接收

说明性 IDEF1X 模型

因此,我建立了一个IDEF1X一个模型中所有点的条件如上所述。如图 1所示(请务必点击链接,以便您可以在更高的分辨率下观察):

图 1 - 信件管理 IDEF1X 模型 - 初稿

一个 用于信息建模集成定义IDEF1X)是被确立为一个非常可取的数据建模技术标准是由美国在1993年12月美国国家标准与技术研究院(NIST)。它完全基于 (a)关系模型的创始人,即EF Codd 博士撰写的一些理论著作;关于 (b)实体关系视图,由PP Chen 博士开发;以及 (c) 逻辑数据库设计技术,由 Robert G. Brown 创建。

事件及其子类型

如上述模型所示,存在超类型-子类型关系

  • 之间Event超类型),和
  • DispatchExitTransportHalfwayStorageDeliveryAttemptReceiving(的亚型)。

所述Eventsuperentity类型具有通用于它的所有亚型,即,特性,LetterNumberDateTime(露出作为复合PRIMARY KEY [PK为了简洁]),具有沿鉴别器,即EventTypeCode,其指示必须是那种精确的亚型实例补充每次Event出现。

的的PKS DispatchExitTransportHalfwayStorageDeliveryAttemptReceiving是在同一时间,外键(FKS)该点到EventPK。

这些子类型中的每一个都显示专门适用于它们中的每一个的属性(或属性),其中一些属性是 FK,用于说明这些子类型与模型中包含的其他一些实体类型之间的关系。

在这方面,您可能会发现我的回答对您有所帮助

数据样本

您没有说明该图是否将用作在特定 SQL 数据库管理系统上构建逻辑数据库结构(具有适当的表、列、列类型和约束)的概念平台,但某些表格形式的数据样本将有助于提供一个更全面的答案,引入更多的可能性。

一个 EventType 表

代表EventType实体类型的表将扮演“查找”角色,它可能包含以下行:

 +-——————————————-+-—————————————————-+-—————————————— ——-+
 | 事件类型代码| 姓名             | 说明     |
 +-——————————————-+-—————————————————-+-—————————————— ——-+
 | D | 调度 | 事件... |
 +--------------+--------------+-------------- ---+
 | E | 退出 | 事件... |
 +--------------+--------------+-------------- ---+
 | T | 运输 | 事件... |
 +--------------+--------------+-------------- ---+
 | H | 中途存储 | 事件... |
 +--------------+--------------+-------------- ---+
 | D | 交付尝试 | 事件... |
 +--------------+--------------+-------------- ---+
 | R | 接收| 事件... |
 +--------------+--------------+-------------- ---+

请注意,EventTypeCode必须作为 PK 约束的列包含有意义的值(因此从最终用户的角度来看非常清晰),这在从具有 FK 约束的列中引用时增强了它们的使用。同时,由于上述值在物理上很(以字节为单位的大小),它们在数据检索过程中表现得非常快,并优化了磁盘空间消耗(主要是从 FK 指向时)。

事件表

然后,让我们假设一个表示名为实体类型的表Event维护主要由数字 1750标识的字母后面的数据点:

 +-————————————-+-———————————————————————————-+-—————— ——————-+
 | 字母编号| 注册日期时间      | 事件类型代码|
 +-————————————-+-———————————————————————————-+-—————— ——————-+
 | 1750 | 2016-11-12 16:58:12.000 | D |
 +--------------+-------------------------+-------- -------+
 | 1750 | 2016-11-15 09:12:05.000 | E |
 +--------------+-------------------------+-------- -------+
 | 1750 | 2016-11-15 10:12:05.000 | T |
 +--------------+-------------------------+-------- -------+
 | 1750 | 2016-11-15 11:12:05.000 | T |
 +--------------+-------------------------+-------- -------+
 | 1750 | 2016-11-15 12:12:05.000 | T |
 +--------------+-------------------------+-------- -------+
 | 1750 | 2016-11-15 12:46:01.000 | H |
 +--------------+-------------------------+-------- -------+
 | 1750 | 2016-11-17 06:24:07.000 | T |
 +--------------+-------------------------+-------- -------+
 | 1750 | 2016-11-17 07:24:07.000 | T |
 +--------------+-------------------------+-------- -------+
 | 1750 | 2016-11-17 08:24:07.000 | T |
 +--------------+-------------------------+-------- -------+
 | 1750 | 2016-11-17 09:10:13.000 | H |
 +--------------+-------------------------+-------- -------+
 | 1750 | 2016-11-18 08:01:01.000 | T |
 +--------------+-------------------------+-------- -------+
 | 1750 | 2016-11-18 09:01:01.000 | T |
 +--------------+-------------------------+-------- -------+
 | 1750 | 2016-11-18 09:27:12.000 | H |
 +--------------+-------------------------+-------- -------+
 | 1750 | 2016-11-19 11:16:08.000 | D |
 +--------------+-------------------------+-------- -------+
 | 1750 | 2016-11-19 11:48:03.000 | R |
 +--------------+-------------------------+-------- -------+

如图所示,该表将保留所有的序列事件字母数1750一期间参与运输。当然,它会将所有事件与所有相关字母保持联系,但为了简化示例,我只描述了与假定的字母编号 1750相关的几个假设行。该表中保存的“时间顺序”数据结构通常称为时间序列

Event.EventTypeCode列应该被限制为 FK,包含指示注册事件类型的值(以用户友好的方式,根据上一节中提到的要点)。

应用程序从代表子类型的表中共享数据

具有部分事件信息的表(如先前讨论的那个)可以显示在例如 Web 应用程序的页面中,该页面提供基于 (a)事件类型、(b)字母重定向到后续页面的链接和(c)的日期和时间的的事件感兴趣。

反过来,后续页面将展示完整的事件信息。例如,如果

  • EventTypeCoded
  • LetterNumber1750,和
  • DateTime2016年11月12日16:58:12.000

然后重定向必须转到显示完整Dispatch行的页面,例如:

 +-————————————-+-———————————————————————————-+-—————— —————————-+
 | 字母编号| 注册日期时间      | 仓库编号|
 +-————————————-+-———————————————————————————-+-—————— —————————-+
 | 1750 | 2016-11-12 16:58:12.000 |               × |
 +--------------+-------------------------+-------- ---------+

万一

  • EventTypeCode牛逼
  • LetterNumber1750,和
  • DateTime2016年11月15日10:12:05.000

重定向应该转到一个页面,该页面列出了整Transport行的信息:

 +-————————————-+-———————————————————————————-+-—————— ——————-+-—————————-+-————————-+-—————————-+
 | 字母编号| 注册日期时间      | 车辆编号| 快递员编号| 纬度| 经度|
 +-————————————-+-———————————————————————————-+-—————— ——————-+-—————————-+-————————-+-—————————-+
 | 1750 | 2016-11-12 16:58:12.000 |              w ^ |         × |        |         ž |
 +--------------+-------------------------+-------- --------+-----------+----------+-----------+

完整性、一致性和可推导性

显然,具有这些特征的数据库结构需要一组相当多的约束,必须设置这些约束来保护数据的完整性,保证其与概念级别确定的规则的一致性(例如,实体类型之间关系的基数/实体类型实例)。

其中一些约束可以通过 PK 和 FK 定义以声明方式配置,但其他约束需要诉诸程序方法——由于主要 SQL 数据库管理系统提供的声明性设施的限制——。

之间必须被程序上执行的规则是,(1)的特征的每个 Event行必须suplemented在任何时候都通过(2)的各自的对应物在恰好一个代表的表的亚型,其中(3)必须“符合”包含在Event.EventTypeCode列中的值——代表鉴别器——,因此使用ACID TRANSACTIONS很方便,以确保始终满足这些情况。其他可能性是使用触发器,但它们往往会使事情变得混乱。

并且,是的,将一些查询“组合”来自一些或所有相关表的数据以例如简化相关数据推导来表达和修复为视图将是实用的。


归档时间:

查看次数:

1319 次

最近记录:

8 年 前