实体-关系数据模型,也叫ER,是你可以用来推理数据的各种数据模型之一。
特别是,它是一个概念性的数据模型,因为它不与任何特定的实现相联系。那是留给逻辑数据模型的任务。
ER数据模型是如此普遍,如此高层次,以至于它可以由各种完全不同的数据库来实现。
这很好,因为你不用考虑实现的细节,而是只考虑你的数据和它是如何组织的。而在这样做的时候,你不得不以你之前没有想到的方式来分析问题。
我发现ER图在帮助你分析涉及数据的场景方面非常出色。
ER模型给你提供了工具,使用图形符号来表示你需要建模的所有数据,不同种类的数据之间的关系,以及与之相关的信息。
有两个项目构成了ER模型。
- 实体
- 关系
实体是具有共同属性的数据类型,如物品或人。
关系是实体之间的关系。
让我给你举个例子,我们来谈谈书和它们的作者。我们有2个实体。
- 书
- 作者
一本特定的书是书实体的一个实例。
由于我们有2个实体,我们在它们之间有2种关系。一个是单一书籍和作者实体之间的关系。一个是单个作者和书籍实体之间的关系。如果我们考虑一下,我们有。
- 一本书有一个作者
- 一个作者可以写很多不同的书
实体的可视化符号
鉴于这个简单的例子,我们可以开始介绍可视化符号,它将帮助我们创建我们场景的ER数据模型。
注意:有许多不同的方法来绘制ER图。我将使用在我看来更直观、更有意义的一种。
实体被表示为矩形,其中有一些文字来识别它们。

关系的视觉符号
实体之间的关系以最基本的形式表示,用一条连接两个关系的线和一个带有一些文字的钻石来识别关系的类型。

请注意,我没有创建两个关系 "书有作者 "和 "作者写书"。我在书和作者之间建立了一个单一的关系 "authored"。
重要性
一旦我们有了一个关系,我们现在必须指出所涉及的数字。目前,我们有很多问题。
- 一本书可以有多少个作者?
- 一个作者可以写多本书吗?
- 一个作者是否需要至少写一本书才能被称为作者?
- 一本书可以由多个作者写吗?
- 一本书可以没有至少一个作者而存在吗?
所有这些都是好问题,在这种情况下,我认为答案是很明显的。而当答案不明显时,你可以思考这个问题,并加入你自己的约束条件。
有各种方法可以在图上直观地表示出心性。有些人喜欢改变线条的形状,当它链接到一个实体时。
我倒是更喜欢数字,它能让事情更清晰。

上面的数字意味着:一本书可以由1个或多个作者撰写。n ,意味着任何数量的元素。
而一个作者可以写过从0本书(也许现在正在写一本)到无限多的书。
第一种叫做零对多的关系。第二种是一对多的关系。
我们也可以有
- 一对一关系
- 多对多的关系
- 零对一关系
属性(Attributes
每个实体可以有一个或多个属性。
比方说,我们将在一个书店中使用上述关系。每个作者都有一个名字,一个简历,一个网站URL。
每本书都有一个标题,一个出版商,一个出版年份,一个ISBN。如果我们愿意,出版商也可以是一个实体。但我们也可以把它定义为一本书的一个属性。
这就是我们可以表示上述信息的方式。

标识符属性
实体必须由一个唯一的键来识别。书籍实体可以通过ISBN属性来唯一地识别。每本书都有一个单一的ISBN(考虑到我们并不代表一本书的单一副本,而是代表一本书的 "标题")。
我们通过底层的主键属性来识别它们。

另一方面,作者目前还没有唯一的标识符。两个作者可以有相同的名字。
因此,我们必须添加一个唯一键属性。例如,一个id 属性。

识别符属性可以跨过多个属性。
例如,护照上的ID和作者所在的国家可以唯一地识别这个人,可以取代我们添加的id 属性。

该选择哪一个呢?这是一个在你的应用中什么更有意义的问题。如果我们在为一家书店建模,我们不能期望拥有所有书籍作者的国家和护照ID。因此,我们将使用一个随机的id ,我们将选择并与每个作者关联。
关系属性
属性不是实体所独有的。关系也可以有属性。
考虑到我们需要对一个图书馆进行建模。除了书和作者实体之外,我们现在引入读者实体,一个借书阅读的人。当他们借书的时候,我们会记下他们的名字和ID卡号。

但是我们仍然缺少信息。我们需要知道这个人什么时候借的书,以及他们归还书的日期,这样我们就可以在图书馆里存储关于某本书的所有历史信息。这些信息既不属于书也不属于读者实体,它属于关系。

弱实体
我们在上面谈到了主键,以及它是如何帮助唯一地识别一个实体的。
有些实体的存在依赖于其他实体,它们被称为弱实体。
假设我们需要为一个网上商店的订单建模。
对于每个订单,我们将存储订单的ID,它从1开始,并随着时间的推移而增加,它被放置的日期和时间,以及关于客户的信息,这样我们就知道该向谁买单,该向哪里发货。
然后,我们还需要知道他们订购了什么。我们创建一个弱实体 "订购的商品",它代表结账时购物车中的每个商品。

这个实体将存储结账时的商品价格(因此当我们改变正在销售的产品的价格时,不会影响已经下的订单),被订购的商品数量,以及选择的选项。比如我们卖的是T恤衫,因此我们需要存储所订购的T恤衫的颜色和尺寸。
它是一个弱实体,因为如果没有订单实体,订购的物品实体就不能存在。
递归关系
一个实体可以与自己有递归关系。假设我们有一个人的实体。我们可以用这种方式来模拟父子关系。

一个人可以有0到n个孩子,一个孩子有2个父母(考虑最简单的情况)。
ISA关系
ISA是IS-A的缩写,它是在ER模型中对概括进行建模的一种方式。
我们用它来把类似的实体放在一个共同的伞下。例如,在书籍和图书馆的例子中,一个作者和一个读者,可以用一个人的实体进行概括。
他们都有一个名字,所以我们可以把名字提取到人的实体中,然后在相应的实体中管理作为一个作者或读者的特殊性。

非二元关系
不是每一种关系都是严格的二元关系。让我们来看看一个课程场景。
今天10点,在学校的一个房间里发生了一节课,老师在给一个班级讲物理。
所以,一节课是在一天中的一个特定时间进行的,它涉及到一个学科、一个老师、一个班级和一个房间。
我们可以用这种方式来模拟它。
