我很难理解在设计数据库时最大基数和最小基数之间的区别。
记住,基数(cardinality)总是与另一件事物有关。
最大基数(Max Cardinality/Cardinality) 总是1或多个。类A与包B之间的关系具有基数为1,这意味着该包中最多只能有一个此类出现。相反,一个包的最大基数可以是N,这意味着可以有N个类。
最小基数(Min Cardinality/Optionality) 简单地意味着“必需的”。它总是0或1。0表示0个或更多,1表示1个或更多。
有很多好的文章解释了这一点,其中一些甚至解释了如何适当地"diagram"。您还可以搜索基数/可选性(OMG术语),它解释了同样的东西,可选性是“Min”,基数是“Max”。
来自 http://www.databasecentral.info/FAQ.htm
问:我知道最大基数在创建数据表之间的关系时如何使用。但是,我不知道最小基数如何应用于数据库设计。我错过了什么吗?
答:你正确地注意到,最大基数比最小基数更重要。所有最小基数告诉你的是,为了使关系有意义,一个表必须具有的最小允许行数。例如,篮球团队必须至少有五名球员,否则它就不是篮球队。因此,球员一侧的最小基数为五,而团队一侧的最小基数为一。
可以争论一个人如果不在团队中就不能成为球员,因此TEAM的最小基数是强制性的。同样,除非组织至少有五名球员,否则它不能成为篮球队。PLAYERS的最小基数也是强制性的。也可以反过来争论。当球员退出团队时,直到招募到替代者之前,它是否停止成为团队?它不能参加任何比赛,但它是否停止成为团队?这是每个单独情况必须根据其自身情况评估的示例。在这种特定情况下,真相是什么?下次出现类似情况时,由于不同的情况,决策可能会有所不同。
Person
有Address
。Person
是否需要有一个Address
?如果是,则关系是无条件的-这意味着最小基数为1。如果不是,则最小基数为0。Person
是否可以拥有多个Address
?如果不能,则最大基数为1。如果可以,则最大基数为>1。在大多数情况下,它是无限制的,通常用N
或*
表示。a=person.address()
替代
if (person.address !=null) {
a=person.address()
}
地址是说明多重性(Multiplicity)的好例子。太多商业应用程序假设每个人只有一个地址,所以当人们拥有例如度假屋时就无法处理。
可以进一步限制基数,例如汽车发动机有2到12个气缸。但是这些限制通常不是非常稳定(Bugatti现在提供了一个16缸发动机)。因此,重要的问题是可选性和多重性。
希望对你有所帮助。
我们来看一个例子 -
学生
选修课程
。在这里,学生
和课程
都是实体。一个学校可能有或没有学生在某个学期注册。想象一下学校在夏季学期提供课程,但没有学生感兴趣加入。因此,学生的基数可以为(0,N)。但如果课程
正在进行,就意味着它至少应该有1个学生注册。因此,它的基数应该是(1,N)。因此,您应该检查参与关系的实体是部分还是全部,这决定了其在关系中的基数。
希望这可以帮助你。
最大基数:
1对1,1对多,多对多,多对1
最小基数:
可选到必选,可选到可选,必选到可选,必选到必选