Таблица имеет отношение один к одному со многими таблицами - PullRequest
3 голосов
/ 22 апреля 2011

1) Может ли таблица иметь отношение один к одному с несколькими таблицами!?

Чтобы уточнить, если я хочу сделать вставку, будет затронута первая таблица и только одна издругие таблицы будут затронуты.

2) и если да, то как будет выглядеть первичный ключ?

3) также, как будет выглядеть запрос, если я хочу получить числозаписи из этих таблиц?

Спасибо.

Ответы [ 2 ]

5 голосов
/ 22 апреля 2011

Может ли таблица иметь отношение один к одному с несколькими таблицами!?

Да, если вы действительно имеете в виду 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

Используя здесь Inner Join, я возвращаю только родительские строки там, где есть дочерняя строка. Если вам нужны все родительские строки и только те дочерние строки, в которых есть совпадение, вы бы использовали левое соединение вместо внутреннего соединения. Если вы хотите выбрать данные из нескольких дочерних таблиц одновременно, вы можете просто включить их в предложение 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 голос
/ 22 апреля 2011

В 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

Мой вопрос: зачем вам разбивать отношения один на один на несколько таблиц? Вы также можете навязать однозначное отношение к данным, если храните все в одной таблице. Это обеспечит более чистые запросы (без объединений) и лучшую производительность.

...