2011-01-20 143 views
11

这可能是一个基本(愚蠢)问题,但是当在数据库中具有一对一关系时,另一个表具有外键ID(在这个例子中)。在一对多关系中,表格包含许多外键。数据库中的一对一和一对多关系之间的差异

但是数据库并不知道这是一对一还是一对多的关系对吧?我在ER-Diagram中创建的关系只是表明在制作实际表时它应该是外键的位置?

尽管我已经阅读了很多关于这方面的教程,但我并没有完全理解关系的概念。

在此先感谢。

回答

13

从某种意义上说,我们所谈论的所有关系都不是已知的到数据库中,它们是我们发明的构造以更好地理解如何设计表。

在一对一和一对多之间的表结构方面的巨大差异在于,在一对一中有可能(但不是必须)具有双向关系,这意味着表A可以在表B中有一个外键,而表B可以在表A中的关联记录中有一个外键。这对于一对多关系是不可能的。

一对一关系将一个表中的一条记录与另一个表中的单条记录相关联。一对多关系将一个表中的一条记录与另一个表中的许多记录关联起来。

3

我很难理解实际问题是什么。

你的分析大部分是正确的,因为如果你有2个表,并且table2有一个到表1的外键,它可以是一对一或多对一的。

您的句子“在一对多关系中,表中包含许多外键”。

'很多'一方的表仍然包含一列是外键,它只是多行可以具有相同的外键值(多行指向一个父键)。

另请注意,您可以将外键放在父表上,而不是其他方式。这样,如果你想这样做,你可以防止一对多。还请注意,这样,多个家长可以共享一个孩子,这可能是也可能不是你想要的。

2

1:1与1:m的数据库级别等效项在外键列上具有唯一索引。请注意,这只适用于1:1,而不是1:0..1,因为在评估唯一性时会考虑null。这种限制有解决方法,但这是基本的。

+0

确切地说,这是一个独特的*约束条件*。索引是偶然的,因为索引只是性能优化功能。在遵循SQL标准的DBMS(除SQL Server及其衍生词之外的大多数DBMS)中,空值在唯一性约束中被忽略*唯一要求仅适用于在约束列中没有空值的行。 – sqlvogel 2011-01-20 20:13:21

5

要启用一对一关系,您需要为外键添加唯一约束。每张表不可能有两个外键,因为它不可能创建记录。

+0

这不是很好的设计,但如果它是真正的1:1(而不是1:0 ... 1),并且您创建了外键列可为空的表格之一,那将是可能的。 – 2011-01-20 20:07:15

1

嗯,你是对的,这种关系对你很重要,但对db本身不重要。当你有两张表,一张带有你的基本信息,另一张带有你的详细信息......对于两张表你都是你,所以它是一对一的关系,你不能将你的数据映射到其他人。

现在,添加第三个表格“城市”,并将其中一个信息点添加到您居住的城市 - 这是一对多(一个城市可以使用,应该用于很多人)的示例。

一对多/一对一只显示您的表如何交互。一直以来,您都希望在表格中“保存”行/列,而不是复制它们,您将使用与另一个表格的一对多关系。或多对多:)

0

让我们假设你有一个具有两个属性A和B的表。如果A是候选键而B不是,那么A和B之间的关系是1到多。如果A和B都是候选键,则关系为1:1

0

所给出的表A和B,如果

  1. A和B具有严格的1对1的关系
  2. 对于每一个B实例总会有一个A实例

最好的办法是让B的主键也是引用A的外键。这也称为“Table per Type Inheritance”和“is a”关系。还有其他方法可以强制使用唯一的外键,但使用主键可以在架构和ER图中清除关系。

当然总会有其他情况,如果您的设计不符合上述两个标准,您将不得不使用另一种方法。

1

同样的例子,一个产品只有一个产品代码,所以它是一个一对一的关系(产品< - > ABC123),但客户可以购买多个产品,所以它的一对一很多关系(人< - >>>产品)。