2015-01-30 2 views
0

Я смущен в отношениях SQL, особенно с One to One и One to Many. Я прочитал много статей, как this и thisConfused on SQL Relationships

Для примера ниже приведены некоторые высказывания из этих статей и некоторые другие статьи

  1. Отношение между клиентами и адресными таблицами один к одному, то есть потому, один адрес принадлежит одному клиенту.

  2. Взаимосвязь между таблицами клиентов и заказов является одной для многих, то есть потому, что один клиент может сделать много заказов.

  3. клиенты и КонтактныеДанные таблицы один к одному, потому что один КонтактныеДанному принадлежат одному клиенту

Да, верно, но взять мой аргумент в настоящее время.

  • В пункте 2 говорится, что отношения являются одними для многих, но один заказ относится к точной право одного клиента? Таким образом, вы можете рассматривать его как один к одному.
  • В пункте 3 contactData и отношения с клиентами называются один к одному, но один клиент может иметь много contactData правильно? Так что это одно для многих

Со всем этим я серьезно запутался. Может ли кто-нибудь дать мне четкое определение о том, как найти отношения, пожалуйста?

ответ

3

Взаимосвязь между таблицами клиентов и заказов является одной для многих, то есть потому, что один клиент может сделать много заказов.

Это должно лучше прочитать

  • клиент может разместить много заказов
  • порядок принадлежит один клиент

Так это один ко многим отношения между таблицами.

клиентов и КонтактныеДанные таблицы один к одному, потому что один КонтактныеДанные принадлежат одному клиенту

Это должно лучше прочитать

  • КонтактныеДанные принадлежит один клиент
  • клиент может иметь только один контактData

Таким образом, это взаимосвязь между таблицами.

Да, на самом деле клиент какой-то компании может иметь более одного контакта, но в этой конкретной базе данных, о которой они говорят, определено, что у клиента может быть только одна контактная информация.

EDIT: Я должен добавить, что вы можете сказать, что между таблицами a и b существует соотношение «один-много», в котором не указывается, что именно, поэтому вы можете быть более точным, говоря «есть один для многих отношений из таблицы a в b "или" существует множество отношений от таблицы b до ". Конечно, у вас нет такой проблемы. (Добавляя к этому, существуют еще более точные определения, такие как «один к одному» или «ноль» и т. Д., Где вы указываете, разрешены ли нулевые записи, например лицо без контактных данных.)

+0

Хорошо, как насчет этого. Представьте себе, что мы записываем «Pension_History» сотрудника. Каждый год он получает свою пенсию, поэтому в таблице через несколько лет должно быть много пенсий, принадлежащих одному «сотруднику». Эти отношения, как я вижу, «один-много», я прав? – Dongle

+0

Да. Каждый пенсия принадлежит ** одному ** лицу; каждый человек может иметь ** много ** пенсий. –

2

Dongle. Вы делаете ошибку, рассматривая объект симметрично. Отношения считаются однонаправленными, поэтому вы сбились с толку.

Возьмем, к примеру, этот Клиент < -> Заказ отношение. Как вы заметили, клиент -> заказ - это нечто совершенно иное, чем заказ -> заказчик. Они на самом деле независимы, какими бы странными они ни были. Это потому, что в реальном коде вы никогда не имеете дело с двумя объектами одновременно, а не «действуете» с точки зрения одного из двух. Например. вы выбрали объект заказа из db, и только тогда вы являетесь клиентом, который сделал этот заказ. Или у вас есть объект клиента, и вы хотите проверить, каковы его заказы.

Как вы видите, это очень однонаправленный (мы называем отношения одно- или двунаправленными). У вас есть объект X, и вы хотите «улучшить» свои знания об этом, присоединив его к другой таблице, к объекту Y. Так что это X-> Y. Или Y-> X. Но на самом деле это не X < -> Y. Вот почему вы всегда должны смотреть на отношения, как если бы они были независимыми.

Кроме того, вы правы, и это обычно бывает так, что один отношение один к одному и другой один ко многим.

+0

Привет, объясните подробнее. – Dongle

+0

Привет. Отредактировал свой ответ. Надеюсь, что это станет понятнее. Но на самом деле это не так.Когда вы напишете несколько запросов, это будет просто абстрактная деталь. Вы почувствуете это, как вы его используете! : -) – Rav

+0

Ваш ответ противоречит ответу JusticeJuice выше! – Dongle

2

Пункт 2 явно one to many, потому что один customer может иметь несколько orders но каждый order принадлежит ровно один customer.

Вы должны прочитать отношения в обоих направлениях.

Представьте себе это отношение был one to one. Вам нужно будет создать новую учетную запись клиента каждый раз, когда вы хотите разместить новый заказ.

Точка 3, вероятно, вопрос дизайна. Если вы хотите разрешить несколько contactData, нет никаких оснований хранить его one to one.

+0

Ваш ответ конфликтует с ответом 'Rav' ниже! – Dongle

+0

@ Dongle, в какой части? Я не вижу конфликта. – JusticeJuice

+0

'Вы должны прочитать отношения в обоих направлениях. Этот раздел ... – Dongle

0

Ваша точка 2 - ответил Рав.

«пункт 3»: я нашел в одном из ваших первых ссылок один к примеру с таблицей «Адреса». В этом примере клиент может иметь только один адрес. Поэтому, если у ваших клиентов может быть больше одного, вам понадобится один для многих (как в примере Orders).

+0

Более одного адреса означает более одного адреса «строки» справа? Мы также можем сохранить много адресов в одной строке, принадлежащих ко многим столбцам, например адресу1, address2, address3 и т. Д. – Dongle

+0

Да, вы связываете строки таблицы «Адрес» со строками таблицы «Клиент» через внешний ключ. В один к одному вы можете подключить только одну строку клиента с одной строкой адреса. И да, вы можете сохранить больше адресов с большим количеством столбцов в одной строке, но это не отношения, и вы будете ограничены количеством столбцов, которые вы назначили для адресов. Я бы не рекомендовал его. Лучше иметь отношения от одного до многих. – okisinch