[19-01-2004] Джо

Краткое описание процесса проектирования реляционной базы данных

MySQL -система управления реляционными базами данных. Реляционная база данных представляет из себя набор таблиц данных, связанных между собой. Relatio (лат) - отношение, порядок расположения ячеек таблицы, одинаковый для всех ее строк, задает отношение между данными строки таблицы. Пример реляционной таблицы:

Магазин снаряжения
МагазинАдресМетроТелефонАссортимент
Терра у ГорьковскойКронверкский пр, 31Горьковская2336303туристическая одежда, обувь,палатки, рюкзаки, спальники
Терра у ЛеснойПарголовская ул, 7Лесная2451290обвязки, веревки, туристическая одежда, треккинговая обувь, палатки, рюкзаки, спальники
СнаряжениеМарата ул, 12Маяковская3110760обвязки, веревки, туристическая одежда, треккинговая обувь, палатки, рюкзаки, спальники
СнаряжениеПерекупной пер, 7/9Площадь Александра Невского1107993NULL

NULL означает, что значение не внесено.

Таблицу называют сущностью, заголовки столбцов таблицы ( наименования полей ) - атрибутами, строку таблицы (запись) - экземпляром сущности, ячейки таблицы ( поля ) - значениями атрибутов.

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

Правила нормализации

1. Значение атрибута для экземпляра сущности должно быть единственным ( 1-я нормальная форма (НФ) сущности );

2. для сущности, уже находящейся в 1НФ, значение каждого неидентифицирующего атрибута должно полностью зависеть от всего уникального идентификатора сущности ( 2-я нормальная форма (НФ) сущности );

3. для сущности, уже находящейся в 2НФ, значение каждого неидентифицирующего атрибута не должно зависеть от значения другого неидентифицирующего атрибута ( 3-я нормальная форма (НФ) сущности );

Попробуем применить эти правила к сущности Магазин снаряжения. Для начала - об идентифицирующих атрибутах. Чтобы избежать путаницы, каждый экземпляр сущности должен иметь идентифицирующий атрибут ( составной идентифицирующий атрибут, состоящий из нескольких неидентифицирующих ). На практике это означает, что в таблице должен присутствовать столбец, все значения в ячейках которого уникальны, не равны NULL и не меняются. В нашей таблице нет ни одного столбца, значения которого были бы уникальны. Самый простой выход - добавить столбец Код, в котором перенумеровать строки по порядку. Первому правилу нормализации явно не удовлетворяет атрибут Ассортимент - в одной ячейке - несколько значений. Чтобы разрешить эту ситуацию необходимо создать новую сущность Вид снаряжения.

Магазин снаряжения
Код магазинаМагазинАдресМетроТелефон
1Терра у ГорьковскойКронверкский пр, 31Горьковская2336303
2Терра у ЛеснойПарголовская ул, 7Лесная2451290
3СнаряжениеМарата ул, 12Маяковская3110760
4СнаряжениеПерекупной пер, 7/9Площадь Александра Невского1107993
Вид снаряжения
Код вида снаряженияНаименование вида снаряжения
1туристическая одежда
2треккинговая обувь
3палатки
4рюкзаки
5спальники
6обвязки
7веревки

При такой организации нет дублирования данных - каждый вид снаряжения вводится только один раз. Очевидно, что между двумя сущностями есть связь. Связи между сущностями обычно бывают 2 типов - "один ко многим" или "многие ко многим". В рассматриваемом примере - связь "многие ко многим" - в каждом магазине несколько видов снаряжения, один и тот же вид снаряжения может быть в нескольких магазинах. Типичный пример связи "один ко многим" - ситуация сотрудник - предприятие (если пренебречь совместительствами) или ситуация отец - дети ( если мать точно знает, кто отец ). Если между сущностями связь "один к одному" - значит одна сущность лишняя.

2-е правило нормализации означает, что мы должны что-то что-то сделать с названиями магазинов Снаряжение. В этом случае атрибут Магазин не полностью зависит от идентифицирующего атрибута Код Магазина. Т. е. в экземплярах сущности с Кодом магазина 3 и 4 содержатся одинаковые значения атрибута Магазин. Но советовать фирме Снаряжение переименовать свои магазины для того, чтобы уложиться в схему нормализации - как-то неправильно, а городить новые сущности для частного случая - только усложнять структуру базы данных. В данном конкретном случае, если все же нормализацию доводить до победного конца, нужно создать еще сущность Название магазина с атрибутами Код магазина и Название.

3-е правило нормализации можно проиллюстрировать так. Допустим, нам надо в описание магазина добавить еще Город и Телефонный код города - два неидентифицирующих атрибута. Но Телефонный код зависит от Города, стало быть, надо создать новую сущность Город с атрибутами - Код ( идентифицирующий ), Название города, Телефонный Код и связать ее с сущностью Магазин снаряжения.

Теперь нужно организовать связь между сущностями Магазин снаряжения и Вид снаряжения. Для этого создаем сущность-связь Магазин >-< Вид снаряжения :

Магазин >-< Вид снаряжения
КодКод магазинаКод вида снаряжения
111
212
321
422

В этой таблице указаны не все указанные выше связи, чтобы не городить слишком большую таблицу.

Теперь, чтобы узнать, например, какие виды снаряжения есть в магазине Ирбис на Фонтанке, нужно сделать запрос к базе данных. Но это уже совсем другая история.

И напоследок правило ( "бритва" ) Оккама:

Не создавайте сущности без необходимости.

realloc() [ 1 ]
При такой нормализации база превращается в "звезду". Т.е. когда вся информация распихана по индексам, собираемым в центральной главной таблице. Вырождение в звезду вредно и будет эффективнее произвести частичную денормализацию. Повторяющимся элементом у нас был только ассортимент, поэтому выносить остальные данные смысла нету.
Джо [ 2 ]
А внимательно прочитать?
В статье вовсе не навязывается какая-то определенная степень нормализации БД, а просто иллюстрируются правила нормализации.
В статье реализована нормализация по ассортименту, про нормализацию по названиям магазинов сказано буквально следующее: "...а городить новые сущности для частного случая - только усложнять структуру базы данных...".
Иначе говоря, если для конкретной задачи мне нужна будет такая нормализация, я ее сделаю, если нет - не буду, ибо любое бесплатное шевеление организма - излишне.
Термин "звезда" в данной ситуации - это именно сущность, созданная без необходимости. Он не проясняет ситуацию, а наоборот, запутывает ее. А ситуация проста - степень нормализации БД определяется задачей, под которую эта БД создана.
Учитесь праввильно пис [ 3 ]
Глупая теория списанная с книжки.
Joe [ 4 ]
Уважаемый "Праввильный пис"! Не стесняйтесь обнародовать свою умную теорию, выдуманную из столь же умной головы. Мы все уже заранее в восхищении )))
Сршуа [ 5 ]
Обязательно ли вводить дополнительное поле с кодом при содании сущности-связи? Если да, то почему.
Джо [ 6 ]
Не не обязательно. В программировании вообще мало обязательных вещей. Просто есть технологии, позволяющие писать быстрее и с меньшим количеством ошибок. А в этом случае я уже даже и не помню, чем руководствовался, воткнув туда код ))) Скорее всего, подспудно имелось в виду, что при программировании конкретных задач может понадобиться уникальный ключ и в этой таблице.
Chief (не Сршуа:) [ 7 ]
Понятно. Спасибо!
Лиза [ 8 ]
Большое спасибо за такую прекрасную статью.
Пускай большинству она уже и известна, но зато очень хорошо все объяснено.
Скорее всего я буду использовать данную информацию на курсах по web-мастерингу, который я веду.
Как раз не хватало хороших примеров, чтобы объяснить моим "студентам".
Поэтому, БОЛЬШОЕ СПАСИБО.
Joe [ 9 ]
Большое пожалуйста! Рекомендую еще мое собственное изобретение - теорию "структурной верстки". Она - как раз для курсов. Посмотреть можно тут - http://webmaster.sbridge.ru/wma/wm11a.php
dedestr [ 10 ]
Все очень хорошо написано, понятным языком и с примерами, как надо, спасибо
Joe [ 11 ]
Пожалуйста, сейчас на http://webmaster.sbridge.ru - 37 статей и почти все они одинаково полезны )))
Альберт [ 12 ]
А может построить виртуальные таблицы на строгой структуре данных... идея не нова, но интересная!
Joe [ 13 ]
Поподробнее, не улавливаю смысла... Виртуальные таблицы - это, надо полагать, таблицы в оперативной памяти. Строгая структура данных - непонятно, что это, допустим, структура данных, нормализованная по всем возможным правилам нормализации. А в чем идея-то?
Olka [ 14 ]
Как организовывается связь многие-ко-многим понятно, а вот как создать запрос на выборку?
Ну вот, например, по запрашиваемому через поиск наименованию вида снаряжения вывести информацию о соответствующих магазинах... Как это делается что-то не доходит(
Джо [ 15 ]
На хороший вопрос - хороший ответ - маленькая статейка, адрес - http://webmaster.sbridge.ru/wm32.php.

* - обязательно заполнить

Комментарий

*Имя

E-mail

*Код: 

*Текст комментария:

Самые популярные статьи