【问题标题】:Table has one to one relationship with many tables表与许多表具有一对一的关系
【发布时间】:2011-04-21 22:28:34
【问题描述】:

1) 一个表可以与多个表建立一对一的关系吗!?

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

2) 如果是的话,主键会是怎样的?

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

谢谢。

【问题讨论】:

    标签: database one-to-one


    【解决方案1】:

    一个表可以与多个表建立一对一的关系吗!?

    是的,如果你真的是指 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)插入父级。 2)从父级选择ID(自动生成)。 3) 插入其中一个孩子。是这样吗?
    • @HTB - 正确假设您使用 AutoNumber 或 Identity 值作为主键。
    • 好的。从不同的孩子那里检索一些记录怎么样。我需要加入还是这样做:“select * from parent, child1, child2.. where parent.id = child1.id || parent.id = child2.id..”!?
    • @HTB - 我已经扩展了我的答案,向您展示了从子表中检索数据的示例。
    【解决方案2】:

    在 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
    

    我的问题是,为什么要将一对一的关系分解为多个表?如果您将数据全部保存在一张表中,您还可以强制与数据建立一对一的关系。这将使查询更清晰(无连接)和更好的性能。

    【讨论】:

    • 太棒了。我的父表是地方。和孩子们是餐厅和酒店......子级在父表中放置了共享列(如 name 和 tel)。每个孩子都有专门的专栏,比如餐厅的菜和酒店的星星。所以,我不得不打破它。如果您有更好的方法,请提出建议。
    • 啊,我明白了。您正在处理在数据库中尝试模型继承。我建议您查看此 SO 帖子:stackoverflow.com/questions/190296/…。它介绍了执行此操作的一些不同技术。
    • 哦,非常感谢安倍。该链接对我帮助很大。伟大的概念。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-20
    相关资源
    最近更新 更多