表与许多表具有一对一的关系

时间:2011-04-21 22:28:35

标签: database one-to-one

1)表格是否与多个表格具有一对一的关系!?

为了澄清更多,如果我想进行插入,第一个表将受到影响 只有其中一个表会受到影响。

2)如果是这样,主键将如何?

3)此外,如果我想检索多个记录,查询会是什么样子 从这些表中?

谢谢。

2 个答案:

答案 0 :(得分:5)

  
    

表格是否与多个表格具有一对一的关系!?

  

是的,如果你的意思是1:0/1:

Create Table Parent
    (
    Id ... not null Primary Key
    , ...
    )

Create Table Child1
    (
    Id ... not null Primary Key
    , Foreign Key ( Id ) References Parent ( Id )
    ...
    )

Create Table Child2
    (
    Id ... not null Primary Key
    , Foreign Key ( Id ) References Parent ( Id )
    ...
    )

此设置需要先在父表中输入一个值,然后再输入子表(无特定顺序)。此外,您可以将一个值添加到其中一个子表而不是另一个,因为它们都只依赖于父表中存在的值而不是彼此。


<强>加成

要从子表中进行选择,它将涉及与任何其他父子关系相同的过程。例如:

Select P.Col1, P.Col2...
    , Child1.Col1, Child1.Col2...
From Parent
    Inner Join Child1
        On Child1.FKCol = Parent.PKCol

通过在这里使用内部联接,我只返回存在子行的父行。如果您想要所有父行以及只有那些匹配的子行,您将使用左连接而不是内连接。如果要同时从多个子表中选择数据,可以在From子句中包含这些数据:

Select P.Col1, P.Col2...
    , Child1.Col1, Child1.Col2...
    , Child2.Col1, Child2.Col2...
    , Child3.Col1, Child3.Col2...
From Parent
    Left Join Child1
        On Child1.FKCol = Parent.PKCol
    Left Join Child2
        On Child2.FKCol = Parent.PKCol
    Left Join Child3
        On Child2.FKCol = Parent.PKCol

答案 1 :(得分:1)

在SQL Server中,您当然可以设计一个能够表示此关系的数据库。您可以通过让子表使用ParentId作为主键并强制唯一性来强制执行一对一关系。

如果您想查询父表,并且它的三个子节点可能有也可能没有现有记录,您的查询将如下所示:

SELECT * FROM ParentTable as pt
LEFT JOIN ChildTable1 as ct1
ON pt.id = ct1.ParentId
LEFT JOIN ChildTable2 as ct2
ON pt.id = ct2.ParentId
LEFT JOIN ChildTable3 as ct3
ON pt.ID = ct3.ParentId

我的问题是你为什么要将一对一的关系分成多个表?如果将所有数据保存在一个表中,您还可以强制实施与数据的一对一关系。这样可以实现更清晰的查询(无连接)和更好的性能。