Я преподаю нормализацию на курсах Access и разбиваю ее несколькими способами.
После обсуждения предвестников раскадровки или планирования базы данных я углублюсь в нормализацию. Я объясняю правила так:
Каждое поле должно содержать наименьшее значащее значение:
Я пишу поле имени на доске, а затем помещаю в него имя и фамилию, как Билл Ламберг. Затем мы запрашиваем студентов и спрашиваем их, с чем у нас будут проблемы, когда имя и фамилия находятся в одном поле. Я использую свое имя в качестве примера, это Джим Ричардс. Если студенты не ведут меня по дороге, то я дергаю их за руку и беру с собой. :) Я говорю им, что мое имя является жестким именем для некоторых, потому что у меня есть то, что некоторые люди считают 2 именами, а некоторые называют меня Ричардом. Если вы пытаетесь найти мою фамилию, то нормальному человеку будет труднее (без подстановочных знаков), потому что моя фамилия похоронена в конце поля. Я также говорю им, что у них будут проблемы с легкой сортировкой поля по фамилии, потому что опять моя фамилия похоронена в конце.
Затем я сообщаю им, что значимость основана на аудитории, которая также будет использовать базу данных. Нам, на нашей работе, не потребуется отдельное поле для номера квартиры или номера, если мы храним адреса людей, но для таких компаний, как UPS и FEDEX, может потребоваться его отдельное выделение, чтобы легко найти квартиру или номер, куда они должны отправиться, когда они в пути и работают от доставки до доставки. Так что это не имеет смысла для нас, но это определенно имеет для них значение.
Избежание пробелов:
Я использую аналогию, чтобы объяснить им, почему они должны избегать пробелов. Я говорю им, что Access и большинство баз данных не хранят пробелы, как в Excel. Excel не заботится, если вы ничего не напечатали в ячейке и не увеличите размер файла, но Access будет резервировать это пространство до того момента, когда вы фактически будете использовать это поле. Поэтому, даже если он пуст, он все равно будет занимать свободное место и объяснит им, что это также замедляет их поиск.
Я использую аналогию с пустыми обувными коробками в шкафу. Если у вас в шкафу есть обувные коробки, и вы ищете пару ботинок, вам нужно будет открыть и посмотреть в каждой из них пару обуви. Если есть пустые коробки для обуви, то вы просто теряете место в шкафу, а также теряете время, когда вам нужно просмотреть их для определенной пары обуви.
Предотвращение избыточности данных:
Я показываю им таблицу, в которой много повторяющихся значений для информации о клиентах, а затем говорю им, что мы хотим избежать дубликатов, потому что у меня есть колбасные пальцы и я буду вводить неверные значения, если мне придется вводить одно и то же снова и снова снова. Эта «толстая» обработка данных приведет к тому, что мои запросы не найдут правильные данные. Вместо этого мы разберем данные на отдельные таблицы и создадим связь, используя поле первичного и внешнего ключа. Таким образом, мы экономим место, потому что мы не вводим имя, адрес и т. Д. Клиента несколько раз, а вместо этого просто используем идентификационный номер клиента в поле для клиента. Затем мы обсудим выпадающие списки / комбинированные списки / списки поиска или что-нибудь еще, что Microsoft хочет назвать их позже. :) Вы, как пользователь, не захотите искать и вводить номер клиента каждый раз в этом поле клиента, поэтому мы настроим раскрывающийся список, который предоставит вам список клиентов, в котором вы сможете выбрать его имя и он заполнит идентификатор клиента для вас. Это будет отношение «один ко многим», тогда как у одного клиента будет много разных заказов.
Избегание повторных групп полей:
Я демонстрирую это, когда говорю о взаимоотношениях «многие ко многим». Сначала я нарисую 2 таблицы: 1, в которой будет храниться информация о сотрудниках, и 1, в которой будет содержаться информация о проекте. Таблицы накрыты аналогично этому.
(Table1)
tblEmployees
* EmployeeID
First
Last
(Other Fields)….
Project1
Project2
Project3
Etc.
**********************************
(Table2)
tblProjects
* ProjectNum
ProjectName
StartDate
EndDate
…..
Я объясняю им, что это не будет хорошим способом установить отношения между сотрудником и всеми проектами, над которыми он работает. Во-первых, если у нас будет новый сотрудник, то у него не будет никаких проектов, поэтому мы будем растрачивать все эти поля, во-вторых, если сотрудник был здесь долгое время, он мог бы работать над 300 проектами, поэтому включить 300 полей проекта. Те люди, которые являются новыми и имеют только 1 проект, будут иметь 299 потраченных впустую полей проекта. Этот дизайн также имеет недостатки, потому что мне придется искать в каждом из полей проекта, чтобы найти всех людей, которые работали над определенным проектом, потому что этот номер проекта может быть в любом из полей проекта.
Я рассмотрел изрядное количество основных понятий. Дайте мне знать, если у вас есть другие вопросы или вам нужна помощь с разъяснением / разбивкой на простом английском языке. Вики-страница не читалась на простом английском языке, и для некоторых она может показаться сложной.