'多对两'的关系

sqw*_*qwk 6 mysql database-design relational-database relationship

我想知道一个'多对两'的关系.孩子可以与两个父母中的任何一个联系,但不能两者兼而有之.有没有办法加强这个?此外,我想防止孩子重复输入.

一个真实的例子是电话号码,用户和公司.公司可以有许多电话号码,用户可以有许多电话号码,但理想情况下,用户不应该提供与公司相同的电话号码,因为数据库中会有重复的内容.

Fra*_*ers 7

这个问题表明你并不完全理解实体关系(没有粗鲁的意图).其中有四种(技术上只有3种)以下类型:

One to One
One to Many
Many to One
Many to Many

一对一(1:1): 在这种情况下,为了遵守标准化,或者更常见的是开放式封闭原则,表格被分解为两部分.

规范化合规性:您可能有一个业务规则,即每个客户只有一个帐户.从技术上讲,在这种情况下,您可以说客户和帐户都可以在同一个表中,但这违反了规范化的规则,因此您将它们拆分并制作1:1.

Open-Close原则合规性:客户表可能包含id,名字和姓氏以及地址.后来有人决定添加一个出生日期,并有能力计算年龄以及一堆其他非常需要的字段.这是一对一的简化示例,但您得到的主要用途是在不破坏现有代码的情况下扩展数据库.编写的许多代码(遗憾地)与数据库紧密耦合,因此表结构的更改将破坏代码.像这样添加1:1将扩展表以满足新要求而不修改原始值,从而允许旧代码继续正常运行,并使用新代码来使用新的db功能.

以这种方式使用1:1关系进行规范化和扩展表的缺点是性能.通常在重度使用的系统上,提高数据库性能的第一个目标是对这些表进行反规范化并将其组合到单个表中,并优化索引,从而无需使用连接和从多个表读取.归一化/去归一化既不是好事也不是坏事,因为它取决于系统的需求.大多数系统通常在需要时开始规范化更改,但是如上所述,这种更改需要非常小心地完成,如果代码紧密耦合到DB结构,它几乎肯定会导致系统失败.即当你组合2个表时,一个表不再存在,所有包含现在不存在的表的代码都会失败,直到它被修改(用db术语,想象当你删除那些表时,将关系连接到1:1中的任何表)这打破了关系,因此必须对结构进行大幅修改以补偿.不幸的是,在大多数情况下,这样糟糕的设计在数据库世界中比在软件世界中更容易发现,而且通常不会发现出现问题在代码中直到它全部崩溃)除非系统设计合理,并考虑关注点的分离.

它是面向对象编程中最接近继承的东西.但它并不完全相同.

一对多(1:M)/多对一(M:1): 这两种关系(hense为什么4成为3)是最受欢迎的关系类型.它们都是相同类型的关系,唯一改变的是你的观点.示例A客户拥有许多电话号码,或者可选地,许多电话号码可以属于客户.

在面向对象的编程中,这将被视为组合.它不是继承,但你说一个项目由许多部分组成.这通常用类中的数组/列表/集合等表示,而不是继承结构.

多对多(M:M): 这种与当前技术的关系是不可能的.出于这个原因,我们需要将它分解为两个一对多关系,并将"关联"表连接起来.两个一对多关系的许多方面始终位于关联/链接表中.

举个例子,说你需要多对多的人是正确的.因为两个到多个实际上是一个很多(意味着多于一个)到很多的关系.这是让系统运行的唯一方法.除非你打算研究关系演算领域,才能找到一种可以实现这种关系的新型关系.

此外,对于这样的关系(m2m),您有两个选择,或者在链接器表中创建复合键,以便字段组合成为唯一条目(如果您对数据库优化感兴趣,这是较慢的选择,但占用的空间较少).或者,您使用自动生成的id列创建第三个字段,并将其作为主键(对于db优化,这是更快的选择,但需要更多空间).

在上面的例子中......

一个真实的例子是电话号码,用户和公司.公司可以有许多电话号码,用户可以有许多电话号码,但理想情况下,用户不应该提供与公司相同的电话号码,因为数据库中会有重复的内容.

这将是与电话号码表的多对多关系,作为公司和用户之间的链接表.如上所述,为确保不重复电话号码,您只需将其设置为主键或使用其他主键并将电话号码字段设置为唯一.

对于那些问题,它实际上取决于你如何表达它们.是什么导致你对此感到困惑,以及如何克服这种困惑,看到解决方案很简单.按如下方式重新解决问题.首先要问的是一对一,如果答案是否定的话,请继续.接下来问的是一对多,如果答案没有继续下去.唯一剩下的选择是多对多.但要小心,确保在继续之前仔细考虑了前两个问题.许多缺乏经验的数据库人员经常通过将一对多定义为多对多来使问题复杂化.到目前为止,最受欢迎的关系类型是一对多(我会说90%)与多对多和一对一分开剩余的10%7/3.但这些数字只是我个人的观点,所以不要引用它们作为行业标准统计数据.我的观点是,在选择多对多之前,要确保它绝对不是一对一.值得付出额外的努力.

所以现在要找到两者之间的链接表,确定哪两个是你的主表,以及它们之间需要共享哪些字段.在这种情况下,公司和用户表都需要共享电话.你需要制作一个新的电话表作为链接器.

一旦你决定3个人都没有为你工作,就会显示出误解的警告.这应该足以告诉你,你根本就没有正确地描述关系问题.随着时间的推移,你会越来越好,但这是一项必不可少的技能,真的应该尽快掌握你自己的治疗方法.

当然,您也可以访问面向对象的数据库,该数据库将允许一系列称为"Hierarchacal"关系的其他关系.如果你想要成为程序员的话,这太棒了.但我不建议这样做,因为当你开始想方设法结合各种类型的关系时,它会让你头疼.特别是由于世界上几乎所有数据库都只包含这三种类型的关系,因此没有太多需要,除非它们是超级特殊的东西.

希望这是一个合理的答案.感谢您抽出宝贵时间阅读它.