Многие ко многим
Ваша бизнес-проблема может быть неясной, поэтому давайте рассмотрим канонический пример книг и авторов.У одной книги может быть несколько авторов, и каждый автор может внести свой вклад в несколько книг.Итак, у нас есть классическая «многие ко многим».
Реляционная база данных не обрабатывает отношения «многие ко многим» напрямую.Для этого мы добавляем третью таблицу, соединяющую две исходные.Назвать эту третью таблицу может быть чем-то вроде загадки, так как она часто представляет собой не очень конкретные деловые отношения.В этом случае authorship
подходит.
Книги и авторы
[книга] -1 ----- 0-1-М- [авторство] -М-1-0 ------ 1- [автор]
Таблицы:
book
pkey
(первичный ключ,уникальный идентификатор каждой книги) title
planned_publish_date
authorship
pkey
(необязательно), поскольку некоторые люди используют два других столбца в объединенном ключе в качестве первичного ключа для этой таблицы) fkey_book
(содержит значение первичного ключа книги, в которую автор вносит свой вклад) fkey_author
(содержит значение первичного ключа автора, который вносит вклад в эту книгу)
author
pkey
(первичный ключ, уникальный идентификаторкаждого автора) name
phone_number
Количество элементов здесь:
- Книга может иметь любое количество
authorship
связанных строк: количество элементов 0, 1, M (M
означает более одного). - Запланированная книга может содержать ноль строк в
authorship
, поскольку она еще не связана ни с одним автором.Позже, когда автор набирается, мы добавляем строку в авторство. - Книга с одним автором имеет одну
authorship
строку, ссылающуюся на одного автора. - Книга с авторствому пары авторов будет две строки
authorship
, каждая с внешним ключом, связывающим строку author
.
- То же самое для отношения
author
- authorship
: количество элементов0, 1, M. - У автора, который был нанят, но еще не зафиксирован ни в одной книге, будет строка в таблице
author
, но нет строк в authorship
. - Авторкоторый работал только над одной книгой, будет иметь один ряд в
authorship
. - Плодовитый автор будет иметь много строк в
authorship
, по одной строке для каждой книги, в которую он внес вклад.
- Строка
authorship
должна быть назначена книге И назначена автору: количество элементов 1: book
, а 1 - author
. - Мы не допускаем, чтобы какие-либо строки
authorship
были «осиротевшими», чтобы использовать язык «родитель-потомок», который используют некоторые люди, подобные мне, при описании отношений в таблице.Другими словами, в каждой строке authorship
поле pkey_book
должно иметь действительное значение, а поле pkey_author
должно иметь действительное значение.
Время
Добавление измерения времени является сложной задачей.
Один пример ... Чтобы отследить период времени, когда каждый авторский контракт на книгу начинается и заканчивается, мы добавили бы пару DATE
столбцов в таблицу authorship
под названием contract_start
& contract_stop
.
authorship
pkey
(первичный ключ для этой таблицы) fkey_book
(содержит значение первичного ключа книги, для которой этоавтор участвует) fkey_author
(содержит значение первичного ключа автора, который вносит вклад в эту книгу) contract_start
(типа DATE
) contract_stop
Запрос для действующих контрактов сравнил бы сегодняшнюю дату как большую или равную contract_start
И меньше- чем contract_stop
.Затем выполните присоединение , чтобы получить название книги и имя автора.
Другой пример ... Если у нашей издательской компании есть бизнес-политика, что автор должен сосредоточиться на одной книге за раз,и хочет, чтобы база данных обеспечивала, чтобы авторский договор не мог пересекаться… ну, это еще одна проблема.Я не буду решать его по нескольким причинам, одна из которых - я не знаю, есть ли у вашего Вопроса эта проблема или нет.
Plane-Местоположение полета
Что касается вашей проблемы с самолетом, я предполагаю, что под Send
вы подразумеваете полет.Если это так, я бы назвал таблицу flight
для ясности.По местоположению, я полагаю, вы имеете в виду аэропорт.Опять же, я бы назвал таблицу airport
для ясности.
Если это то, что вы имели в виду, то у вас та же мощность, что и описанная выше.
- Возможно, самолет, присоединившийся к флоту, еще никогда не летал, не летал один раз или летел во многих местах.Итак, 0-1-М.
- Аэропорт может стать известен нашей системе еще до того, как мы полетим там на каких-либо самолетах, поэтому нулевые ряды рейсов.Позже, один или несколько рядов рейсов, когда мы планируем один или несколько самолетов в этот аэропорт.Так, 0-1-M.
В таблице flight
есть столбцы для даты-времени отправления и для продолжительности.
flight
pkey
(первичный ключ для этой таблицы) fkey_plane
(содержит значение первичного ключа плоскости, в которую летятэтот аэропорт в это время) fkey_airport
(содержит значение первичного ключа аэропорта, в который этот самолет отправляется в это время.) departure
(когдаэтот полет взлетает, типа TIMESTAMP WITH TIME ZONE
) duration
(продолжительность этого полета, количество минут).
[самолет] -1 ----- 0-1-M- [полет] -M-1-0 ------ 1- [аэропорт]
Ваши бизнес-правила могут отличаться.Если вы планируете полет, но еще не назначили самолет, у нас может быть строка flight
без назначенного самолета.Таким образом, мощность 1
меняется на 0 or 1
.Но не M
, поскольку в одном конкретном полете никогда не участвуют несколько самолетов.В случае этого бизнес-правила строка flight
может быть потерянной, без родителя plane
до тех пор, пока в конечном итоге не будет назначена конкретная плоскость.
[самолет] -1-0 ----- 0-1-M- [полет] -M-1-0 ------ 1- [аэропорт]