Разработка базы данных «Расход медикаментов», страница 2

Рассмотрим эти таблицы подробнее. В таблице пациенты мы введём первичный ключ – код пациента, таким образом, мы гарантируем, что в этой таблице не будет дублирующихся записей. Все атрибуты этой таблицы атомарные (атрибут Ф.И.О. будем считать атомарным, т.к. нам не требуется производить отдельные действия с именами или отчествами пациентов). Исходя из приведенного выше определения, можно утверждать, что эта таблица находится в первой нормальной форме. Аналогично, введя первичный ключ – код лекарства в таблице «Лекарства», мы утверждаем, что она находится в первой нормальной форме. Для того чтобы исключить дублирующиеся записи в третьей таблице, мы введём составной первичный ключ (т.к. ни один атрибут не может быть уникальным для каждой записи) – STR (код пациента) + ”-” + STR (код лекарства) + DTOC (начало лечения). Атрибут начало лечения пришлось включить потому, что врач может повторно выписать тоже лекарство тому же пациенту (например, в случае рецидива болезни), если при этом пациент ещё не выписался. Если бы пациент успел выписаться и пришёл повторно за тем же лекарством, то его бы внесли в таблицу с новым кодом пациента. Так как значением ключа является строка, то нам пришлось ввести символ разделитель “-”, иначе у нас возможны ситуации когда, например, пациент с кодом 1 получает лекарство с кодом 12 (значение ключа ”121”+”дата”) и пациент с кодом 12 получает лекарство с кодом 1 в тот же день (значение ключа ”121”+”дата”). Следовательно, мы так можем потерять уникальность ключа.

Также в этой таблице присутствует вычисляемый или составной атрибут - количество израсходованного лекарства = (конец лечения – начало лечения+1)/количество приёмов в день, где количество приёмов будем рассматривать как дневную дозу. Поэтому мы не будем вносить этот атрибут в таблицу, а будем вычислять его при создании отчёта для конкретного пациента.

Теперь все наши таблицы находятся в первой нормальной форме и выглядят следующим образом:

1.  Пациенты (код пациента, Ф.И.О., палата, отделение).

2.  Лекарства (код лекарства, название лекарства, способ применения, цена).

3.  Пациенты-Медикаменты (код пациента, код лекарства, начало лечения, конец лечения,  дневная доза).

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

«Определение для второй нормальной формы - отношение R находится во второй нормальной форме в том и только в том случае, когда находится в первой нормальной форме, и каждый неключевой атрибут полностью функционально зависит от первичного ключа». [3] Под функциональной зависимостью понимается ситуация, когда «в отношении R атрибут Y функционально зависит от атрибута X (X и Y могут быть составными) в том и только в том случае, если каждому значению X соответствует в точности одно значение Y:  R.X (r) R.Y.

Функциональная зависимость R.X (r) R.Y называется полной, если атрибут Y не зависит функционально от любого точного подмножества X». [3]

Приведём виды функциональной зависимости в первой таблице:

·  Код пациента -> Ф.И.О.

·  Код пациента -> палата

·  Код пациента -> отделение

То есть эта таблица находится во второй нормальной форме.

Функциональные зависимости во второй таблице:

·  Код лекарства - > название лекарства

·  Код лекарства - > способ применения

Но цена не имеет функциональной зависимости от кода лекарства, т.к. одно и тоже лекарство могло поступить в разное время и по разной цене. Поэтому одному и тому же коду лекарства может соответствовать несколько значений цен и при этом код лекарства не сможет являться первичным ключом. Для того чтобы исправить такое положение вещей мы введём дополнительную таблицу «Цены» (код лекарства, цена, дата поставки) введём в ней составной первичный ключ STR (код лекарства) + DTOC (дата поставки). Теперь обе таблицы находятся во второй нормальной форме.

Функциональные зависимости в третьей таблице:

·  STR (код пациента) + ”-” + STR (код лекарства) + DTOC (начало лечения) - > дневная доза

·  STR (код пациента) + ”-” + STR (код лекарства) + DTOC (начало лечения) - > конец лечения

Атрибут конец лечения заносится врачом заранее при выписывании лекарства.

После привидения ко второй нормальной форме наша база данных приняла следующий вид:

1.  Пациенты (код пациента, Ф.И.О., палата, отделение).

2.  Лекарства (код лекарства, название лекарства, способ применения).

3.  Пациенты-Медикаменты (код пациента, код лекарства, начало лечения, конец лечения,  дневная доза).

4.  Цены (код лекарства, цена, дата поставки).

«Определение для третьей нормальной формы - отношение R находится в третьей нормальной форме  в том и только в том случае, если находится во второй нормальной форме и каждый неключевой атрибут нетранзитивно зависит от первичного ключа. Функциональная зависимость R.X -> R.Y называется транзитивной, если существует такой атрибут Z, что имеются функциональные зависимости R.X -> R.Z и R.Z -> R.Y и отсутствует функциональная зависимость R.Z --> R.X. (при отсутствии последнего требования мы имели бы "неинтересные" транзитивные зависимости в любом отношении, обладающем несколькими ключами.)». [3]

В данной базе предполагается, что номера палатидут непрерывно, т.е., например, палаты 1-4 принадлежат одному отделению, а палаты 5-8 – другому ( или другими словами в разных отделениях нет палат с одинаковыми номерами).

Исходя из этого условия можно определить следующий вид транзитивной зависимости для первой таблицы:

·  Код пациента -> палата

·  Палата -> отделение

·  Код пациента -> отделение