Как кардинальность работает в диаграмме ER при рассмотрении измерения времени? - PullRequest
0 голосов
/ 24 февраля 2019

Я объясню свой вопрос, используя фрагмент проблемы, в которой есть две сущности:

? Самолет

? Местоположение

И связь, чтобы связать эти лица:

? Отправить

Логика 1:

Самолет отправляет минимум 1 место и самое большее - несколько мест (в разные моменты) , следовательно, количество элементов от одного ко многим (1, N).

Airplane ——— (1,N) ——— Send ——— (1,N) ——— Location 

Логика 2:

Самолет отправляет минимум 1 место, но НЕ МОЖЕТ отправлять много мест одновременно , следовательно, минимум равен 1, а также максимум равен 1, поэтому количество элементов равно одному к одному (1,1).

Airplane ——— (1,N) ——— Send ——— (1,1) ——— Location

Не только в ER, но и в базе данных.Какая из этих логик верна?

1 Ответ

0 голосов
/ 24 февраля 2019

Многие ко многим

Ваша бизнес-проблема может быть неясной, поэтому давайте рассмотрим канонический пример книг и авторов.У одной книги может быть несколько авторов, и каждый автор может внести свой вклад в несколько книг.Итак, у нас есть классическая «многие ко многим».

Реляционная база данных не обрабатывает отношения «многие ко многим» напрямую.Для этого мы добавляем третью таблицу, соединяющую две исходные.Назвать эту третью таблицу может быть чем-то вроде загадки, так как она часто представляет собой не очень конкретные деловые отношения.В этом случае 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- [аэропорт]

...