Igo*_*gor 7 erd database-design database-diagrams
我正在尝试为运输公司数据库创建实体关系图。该数据库应存储有关信件、交付、将信件从一个仓库转移到另一个仓库以及历史信息的信息。它应该允许跟踪信件,例如,检查特定仓库中特定日期的信件。
我要建模的过程如下所示:
这是我迄今为止创建的数据库图:
信件和仓库之间的关系是指当信件被快递员提取时,它会被放入该仓库。
这个图是否正确,我可以改进什么?
运输和仓库之间是否存在关系(从以前的运输和信函的初始仓库可以推断出)?
虽然你说你图中所示的结构是一个大学项目的一部分,其目的应该是让它尽可能的真实,所以我认为,开展了的专家接受记者采访时(或系列访谈)对应公司可能会非常有帮助(也许是必不可少的)。
这样,由于为此类业务领域创建完整且准确的实体关系图(或其任何衍生图)将需要更深入的检查(因此,需要进行非常长的一系列调整和fro-ings),这个答案的目的是为你指出你可能必须采用的技术方法的正确方向,提出一个说明性分析,其中包括我的 IDEF1X 模型的初稿,该模型由看起来可行的元素组成,以便您可以将其用作参考来捕捉真实场景的含义。
我看到它的方式,业务领域分析,需要特别注意的方面是事件,其中信可能参与; 因此,我将在下面详细说明一个假设上下文,其中包含一些看似相关的假设事件类型(但是,自然而然,您应该自己确认、修改或丢弃所有讨论的点)。
我列出了我认为对转发情况特别有帮助的元素(在我们通过 chat 的谈话中提出):
- [A]任何时候,我都想知道这封信在哪里——不管它是在某个仓库里还是正在运输中。
- 在我的设计中,发件人只是一封信的原始发件人(公司的客户),而收件人(收件人)是一个收信人 - 一封信总是有一个发件人和一个收件人。
- [F] 或一种运输只能有一种快递。
- 一封信最多可存放10个左右的仓库。然而,所有仓库的数量要高得多——几百个(甚至几千个)。
- 我的想法是将每个客户端(发件人/收件人)存储在数据库中。因此,如果某人发送或接收了至少一封信,它 [...] 在数据库中(但如果某人发送/接收更多信件,则它仅在数据库中一次)。
然后,基于 (a) 这些元素,(b) 你的问题的内容,以及 (c) 一些看起来可行的估计和假设,我写了以下公式来描述假设实体类型之间的初步相互关系(即,业务上下文规则的重要组成部分,用于定义相应的概念模型):
人、信和地址
信件和事件
1 调度。当某个人将特定的信件留在精确的仓库中以便它可以参与运输过程时发生的事件。
2 退出。当特定信件离开给定仓库开始运输时发生的事件。
3 运输。特定信件在运输过程中在不同仓库之间移动时发生的事件。
4 中途存储。在运输途中将具体的信件保存在确切的仓库中时发生的事件。
5 交付尝试。当某个人(扮演快递员的角色)试图将特定的信件发送给其中提到的人时发生的事件。
6 接收。当地址中收到某封信时发生的事件,该地址可定位在该信中提及的人。
注意:其中一些类型的事件(或事件类型)可能会针对某个字母出现多次(例如,在整个运输过程中,一个字母可能涉及多个运输事件);其他类型的事件似乎仅限于关于具体运输过程的独特事件(例如,调度和接收)。另一方面,一个真正的业务领域可能需要更多的事件类型,并且本答案中讨论的那些可能根本不适用或可能具有不同的特征,这就是为什么自己执行分析是最重要的。此外,我在这里使用的术语只是解释性的,因为它们可能与实际组织中使用的术语不同。
Warehouse 和 Event 的不同子类型:Dispatch、Exit 和 HalfwayStorage
车辆和事件的不同子类型:Exit、Transport 和 DeliveryAttempt
Person 和事件的子类型:Transport、DeliveryAttempt 和 Receiving
因此,我建立了一个IDEF1X一个模型中所有点的条件如上所述。如图 1所示(请务必点击链接,以便您可以在更高的分辨率下观察):
一个 用于信息建模集成定义(IDEF1X)是被确立为一个非常可取的数据建模技术标准是由美国在1993年12月美国国家标准与技术研究院(NIST)。它完全基于 (a)关系模型的创始人,即EF Codd 博士撰写的一些理论著作;关于 (b)实体关系视图,由PP Chen 博士开发;以及 (c) 逻辑数据库设计技术,由 Robert G. Brown 创建。
如上述模型所示,存在超类型-子类型关系
Event
(超类型),和Dispatch
,Exit
,Transport
,HalfwayStorage
,DeliveryAttempt
和Receiving
(的亚型)。所述Event
superentity类型具有通用于它的所有亚型,即,特性,LetterNumber
和DateTime
(露出作为复合PRIMARY KEY [PK为了简洁]),具有沿鉴别器,即EventTypeCode
,其指示必须是那种精确的亚型实例补充每次Event
出现。
的的PKS Dispatch
,Exit
,Transport
,HalfwayStorage
,DeliveryAttempt
和Receiving
是在同一时间,外键(FKS)该点到Event
PK。
这些子类型中的每一个都显示专门适用于它们中的每一个的属性(或属性),其中一些属性是 FK,用于说明这些子类型与模型中包含的其他一些实体类型之间的关系。
在这方面,您可能会发现我的回答对您有所帮助
以及按子类型标签分组的答案。
您没有说明该图是否将用作在特定 SQL 数据库管理系统上构建逻辑数据库结构(具有适当的表、列、列类型和约束)的概念平台,但某些表格形式的数据样本将有助于提供一个更全面的答案,引入更多的可能性。
代表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)的日期和时间的的事件感兴趣。
反过来,后续页面将展示完整的事件信息。例如,如果
EventTypeCode
是d,LetterNumber
是1750,和DateTime
为2016年11月12日16:58:12.000,然后重定向必须转到显示完整Dispatch
行的页面,例如:
+-————————————-+-———————————————————————————-+-—————— —————————-+ | 字母编号| 注册日期时间 | 仓库编号| +-————————————-+-———————————————————————————-+-—————— —————————-+ | 1750 | 2016-11-12 16:58:12.000 | × | +--------------+-------------------------+-------- ---------+
万一
EventTypeCode
是牛逼,LetterNumber
是1750,和DateTime
是2016年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 次 |
最近记录: |