Проектирование базы данных - Как обрабатывать условные данные - PullRequest
0 голосов
/ 26 февраля 2019

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

Мой случай :

Рассмотрим эти две таблицы:

patients                           |     vaccines                
                                   |
id | name     | birthdate          |     id | name
---------------------------        |     ---------------
1  | John Doe | 1994-03-12         |     1  | Tetanus
---------------------------        |     ---------------
2  | Jane Doe | 1996-80-02         |     2  | Hepatitis A

И эту сводную таблицу

patient_vaccine

id | patient_id | vaccine_id | date_received | comment
----------------------------------------------------------------
1  | 1          | 1          | 2019-01-01    | Lorem ipsum dolor set
----------------------------------------------------------------
2  | 1          | 2          | 2019-01-12    | Lorem ipsum dolor set
----------------------------------------------------------------
3  | 2          | 1          | 2018-09-21    | Lorem ipsum dolor set

Очевидно, чтобы сказать, что конкретный пациент принял конкретную вакцину, будет вставлена ​​новая записьв сводной таблице, имеющей patient_id с vaccine_id вместе с дополнительными данными.

Но у меня есть ситуация, когда, если пациент моложе 18 лет , будетнет vaccine_id, вместо этого будет took_all_vaccines логическое значение.

Мой вопрос :

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

id | patient_id | took_all_vaccines | date_received | comment
----------------------------------------------------------------
1  | 1          | 1                 | 2019-01-01    | Lorem ipsum dolor set
----------------------------------------------------------------
2  | 1          | 0                 | 2019-01-12    | Lorem ipsum dolor set
----------------------------------------------------------------
3  | 2          | 9                 | 2018-09-21    | Lorem ipsum dolor set

или я должен поместить столбец вставки took_all_vaccines в сводную таблицу и сделать его обнуляемым, если он будет нулевым для людей старше 18 лет, что такженеобходимо, чтобы столбец vaccine_id обнулялся для людей младше 18 лет.

так что я бы закончил с чем-то вроде этого:

id | patient_id | vaccine_id | took_all_vaccines | date_received | comment
-----------------------------------------------------------------------------
1  | 1          | 1          | null              | 2019-01-01    | Lorem ipsum dolor set
-----------------------------------------------------------------------------
2  | 1          | 2          | null              | 2019-01-12    | Lorem ipsum dolor set
-----------------------------------------------------------------------------
3  | 2          | null       | 1                 | 2018-09-21    | Lorem ipsum dolor set

Если кто-то - решение лучше, почему?а почему другой нет?

Ответы [ 2 ]

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

Я бы не стал использовать флаг или добавить «Взять все вакцины» в качестве записи в таблицу Patient_vaccine.

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

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

Таблица, которую вы называете сводной таблицей, в стандартном реляционном дизайне обычно называется таблицей преобразователя «многие ко многим».Это потому, что на высоком уровне ваш дизайн предполагает отношения между пациентом и вакцинами, от многих ко многим.

  • Пациент может принимать много вакцин
  • Вакцину могут принимать многие пациенты

Теперь к вашему конкретному вопросу:

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

Первое, что касается вакцин, эточто AFAIK, несколько вакцин часто объединяются в один выстрел.Так что это требует либо таблицы «выстрела», либо способности таблицы вакцин поддерживать родительскую дочернюю иерархию.

"Взял все вакцины", мне кажется, является неспецифическим и фактически неточным представлением, но опять же я не знаю вашего применения.

Учитывая это, самый простой и лучший ответпо моему мнению, это добавить в Vaccine строку под названием «Все вакцины (пациент в возрасте до 18 лет)».

Тогда вам больше не нужно заботиться о внешних ключах NULL, чего вы, конечно, не делаете.хочу в таблице разрешения многих ко многим.

Другой альтернативой будет реализация таблицы контейнера выстрела (снимок 1 -> Многие вакцины) и замена функции Patient_shot на имя пациента_вакцины.Вы также можете сделать что-то подобное, объединив прививку и вакцину в единую иерархическую таблицу, в которой вакцины могут иметь родительскую строку «вакцина».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...