Сергей Дуплик дата публикации 25-10-2009 01:18 О формировании имен объектов баз данных
После создания структуры базы данных в голове или на бумаге наступает этап, когда созданную структуру нужно реализовать в базе данных. И тут возникает проблема: как назвать таблицы, поля и прочие объекты. Именно этому вопросу и будет посвящена данная статья.
Статья написана на основе разработки реального и довольно большого проекта автоматизации работы ВУЗа, которой автор посвятил более 6 лет. Большая и сложная задача требует разработки сложной структуры базы данных, с которой работают многие разработчики. Чтобы унифицировать имена объектов был разработан ряд правил их именования, которых придерживались все разработчики.
В качестве примера возьмем распространенную задачу (как учебную, так и реальную): автоматизация деятельности одного деканата, работающего с несколькими специальностями. Данная задача будет рассматриваться в предельно упрощенном виде, т.к. автоматизация деятельности реального деканата гораздо сложнее и сильно выходит за рамки статьи.
В базе данных могут присутствовать следующие типы объектов:
- таблицы (tables)
- представления (views)
- хранимые процедуры (stored procedures)
- функции пользователей (user functions)
- иные объекты
В зависимости от конкретной СУБД этот набор может меняться. Например, для Dbase будут только таблицы, для MS Access — таблицы и представления, а для MS SQL Server и Oracle — все типы объектов (да еще и масса других).
Для нашего примера понадобятся:
- Таблицы: статусы студентов, специальности, предметы, люди, студенты, персональные планы студентов.
- Хранимые процедуры: создание записи о человеке, изменение записи о человеке, создание/изменение записи о студенте, получение персонального плана, открытие персонального плана на следующий семестр.
- Функции: получить ФИО, получить количество предметов в текущем семестре.
Предлагаются следующие общие правила именования объектов.
1. Имя объекта составляется из трех частей:
префикс типа объекта + префикс проекта + название объекта
Префикс типа объекта указывает, к какому типу относится данный объект. Предлагается использовать следующие префиксы:
Тип объекта | Префикс |
Таблица | t |
Представление | v |
Хранимая процедура | p |
Функция | f |
Триггер | tr, trg |
Индекс | i, ind, idx |
|
Префикс проекта используется, когда в одной базе данных содержатся объекты, относящиеся к разным проектам. В частности, в разрабатываемой нами системе были объекты, относящиеся к управлению работой ВУЗом и объекты, относящиеся к анкетированию студентов, которые не входили в систему управления, но использовали некоторые ее таблицы.
После префикса проекта рекомендуется ставить символ подчеркивания ("_").
2. Название объекта должно отражать суть или назначение данного объекта.
3. Название объектов составляются из одного или нескольких слов, причем сокращения не допускаются. Сокращения могут применяться только в том случае, если название получается очень длинным (больше 25-30 символов). Первые буквы слов пишутся заглавными, остальные — строчными, либо разделение слов производится с помощью символа подчеркивания ("_").
4. Наименования полей, параметров и т.д. подчиняются правилу 3, но допускаются сокращения без потери смысла.
Таблицы являются основой любой базы данных и предназначены собственно для хранения данных.
При создании таблиц предлагается придерживаться следующих правил:
- имя таблицы отражает суть хранящихся в ней данных и дается во множественном числе.
Например, tStudents — таблица с данными о студентах, tPerson-alPlans — персональные планы студентов
- каждая таблица должна иметь поле-идентификатор, значение которого автоматически увеличивается на 1 при добавлении записи в таблицу. Данное поле имеет имя ID (без префиксов и окончаний), не может содержать пустых значений (NULL), значения являются уникальными.
В зависимости от задачи иногда может оказаться, что в качестве подобного идентификатора лучше использовать не абстрактный счетчик, а числовое или текстовое поле, содержащее реальный атрибут объекта (например, идентификатор из другой таблицы или глобальный идентификатор — GUID) с соблюдением требований к уникальности значения. Например, когда таблица разбивается на две таблицы, в первой из которых используется автоинкрементный идентификатор, а во второй идентификатором является значение идентификатора из первой таблицы.
- имена остальных полей должны отражать суть хранящихся в них данных и составляются, исходя из правила 4 Общих правил именования объектов.
- поле, хранящее текстовое наименование объекта, называется Name (без префиксов и окончаний). Данное поле обязательно для заполнения, т.е. не может содержать пустых значений (NULL).
- поле, хранящее расшифровку наименования объекта (полное, сокращенное и т.д.), называется в соответствии с этим наименованием и в конце содержит "Name".
Например, ShortName, FullName, DisplayName
- поле, содержащее ссылку на запись другой таблицы, составляется из имени таблицы, на которую оно ссылается без префиксов типа и проекта и в единственном числе, в конце имени добавляется окончание "ID". Для таких полей обязательно построение связи с таблицей, на которую оно ссылается для обеспечения ссылочной целостности базы данных.
Например, StudentID, DepartmentID или DepID, PersPlanID
- поля, содержащие дату, оканчиваются на "Date".
например, StartDate, EndDate, CheckDate, EntranceDate
- битовые поля начинаются с префикса "Is". Желательно, чтобы данное поле имело предопределенное разработчиком значение по умолчанию (0 или 1) в зависимости от его назначения.
Например, IsActual, IsVisible, IsCheck
- другие префиксы и окончания в именах полей не используются.
- одинаковые по смыслу поля в разных таблицах называются одними и теми же именами, даже если хранящиеся данные относятся к разным областям.
Например:
- если в разных таблицах есть ссылка на таблицу студентов, то поле называется StudentID
- поле Name может хранить полное название специальности, предмета, чего-либо еще, но все это — название. Поэтому и поля называются одинаково. Уточнение, к чему относится данное название (т.е. SpecName, SubjName и т.д.), давать не стоит, т.к. это ясно из того, в какой таблице находится поле (и соответственно из имени этой таблицы)
Таблицы бывают следующих типов:
- системные классификаторы
- пользовательские классификаторы
- таблицы данных
Системные классификаторы — это таблицы, содержимое которых заполняется и изменяется только разработчиками базы данных. Пользователи могут просматривать эти таблицы в рамках своих прав доступа, но добавлять, изменять и удалять записи не могут.
Имена системных классификаторов оканчиваются на "Types" (например, tStudentStatusTypes, tPersPlanRecordTypes).
Структура системных классификаторов состоит из следующих полей:
- ID — идентификатор записи
- Name — название, отображаемое пользователям
- другие поля, относящиеся к записи; могут отсутствовать
Поскольку данные в таких таблицах изменяются только разработчиками, то в программах и в хранимых процедурах можно использовать идентификаторы записей для проверки различных условий.
Пользовательские классификаторы — это таблицы, содержимое которых изменяется достаточно редко. Данные в таких таблицах могут добавляться, изменяться и удаляться пользователями в рамках своих прав доступа.
Структура таких таблиц произвольна, обязательным полем является только поле-идентификатор ID. Как правило, подобные таблицы не содержат большого количества полей и записей.
Таблицы данных — это таблицы, хранящие данные, с которыми постоянно работают пользователи. Содержимое этих таблиц постоянно изменяется, добавляются и удаляются записи.
Структура таких таблиц произвольна, обязательным полем является только поле-идентификатор ID.
Подобный подход к наименованию полей позволяет обеспечить одинаковость структуры таблиц-классификаторов и не задумываться об именах ссылочных полей при построении связей между таблицами, т.к. имена полей будут почти полностью совпадать с именами таблиц.
Таблица "Статусы студентов"
Тип таблицы: системный классификатор
Название: tStudentStatusTypes
Структура:
Наименование поля | Тип | Описание | Примечание |
ID | Целый | Уникальный идентификатор | |
Name | Строка(255) | Наименование | Должно быть заполнено |
|
В таблицу заносятся следующие записи: абитуриент, обучаемый, закончивший семестр, дипломник, выпускник, академотпускник, отчисленный.
Таблица "Специальности"
Тип таблицы: пользовательский классификатор
Название: tSpecialities
Структура:
Наименование поля | Тип | Описание | Примечание |
ID | Целый | Уникальный идентификатор | |
Name | Строка(255) | Наименование | Должно быть заполнено |
FullName | Строка(255) | Полное наименование | |
SemesterCount | Целый | Количество семестров обучения по специальности | |
|
Таблица "Предметы"
Тип таблицы: пользовательский классификатор
Название: tSubjects
Структура:
Наименование поля | Тип | Описание | Примечание |
ID | Целый | Уникальный идентификатор | |
Name | Строка(255) | Наименование | Должно быть заполнено |
|
Таблица "Люди"
Тип таблицы: таблица данных
Название: tPeople
Структура:
Наименование поля | Тип | Описание | Примечание |
ID | Целый | Уникальный идентификатор | |
LastName | Строка(255) | Фамилия | Должно быть заполнено |
FirstName | Строка(255) | Имя | |
SirName | Строка(255) | Отчество | |
Sex | Битовое | Пол | Единственное битовое поле, где можно отойти от правила использования префикса "Is" и значение по умолчанию |
BirthDate | Дата | Дата рождения | |
Passport | Строка(255) | Паспортные данные | |
Address | Строка(255) | Адрес проживания | |
Photo | Двоичные данные | Фотография | |
|
Таблица "Студенты"
Тип таблицы: таблица данных
Название: tStudents
Структура:
Наименование поля | Тип | Описание | Примечание |
ID | Целый | Уникальный идентификатор | |
PeopleID | Целый | Человек | Ссылка на таблицу "Люди". Должно быть заполнено |
SpecID | Целый | Специальность | Ссылка на таблицу "Специальности". Должно быть заполнено |
Semester | Целый | Номер текущего семестра | По умолчанию — 1 |
StatusTypeID | Целый | Статус студента | Ссылка на таблицу "Статусы студентов". Должно быть заполнено |
|
Таблица "Персональные планы студентов"
Тип таблицы: таблица данных
Название: tPersonalPlans
Структура:
Наименование поля | Тип | Описание | Примечание |
ID | Целый | Уникальный идентификатор | |
StudentID | Целый | Студент | Ссылка на таблицу "Студенты". Должно быть заполнено |
SubjectID | Целый | Предмет | Ссылка на таблицу "Предметы". Должно быть заполнено |
Semester | Целый | Семестр, в котором изучается предмет | Должно быть заполнено |
Result | Строка(50) | Оценка | Если не заполнено, предмет считается не пройденным |
ResultDate | Дата | Дата простановки оценки | |
IsActual | Битовое | Признак актуальности записи | По умолчанию — 1 (актуально) |
|
Деление на таблицы людей и студентов сделано по двум причинам:
- один и тот же человек может обучаться на нескольких специальностях (как параллельно, например, на разных формах обучения, так и последовательно — закончить обучение по одной специальности и поступить на другую)
- если в плане развития системы необходимо будет завести таблицу сотрудников, то персональные данные о сотрудниках (ФИО, паспортные данные и т.д.) можно будет хранить в таблице "Люди", а данные о месте работы (подразделение, должность и т.д.) — в новой таблице. Кроме того, один и тот же человек может быть и сотрудником, и студентом.
Представления нужны для упрощения запросов и для предоставления пользователю готовых сводных данных из нескольких таблиц.
Представления фактически представляют собой запросы к базе данных и строятся по правилам, описанным далее.
При написании запросов предлагается использовать следующие правила:
- запросы на выбор всех полей (select *) являются нежелательными, т.к. могут выбирать много ненужных данных, особенно при наличии в таблице больших текстовых и двоичных полей. В результате это приводит к большому трафику при передаче результатов запроса по сети и большому объему памяти для их хранения у клиента. Поэтому в запросе рекомендуется явно указывать, какие поля из каких таблиц выбирать. Исключением являются запросы, выбирающие все или подавляющее большинство полей из таблицы или связки таблиц; однако если в выборке будут присутствовать ненужные поля большого объема (например, "Фотография"), рекомендуется перечислить все поля отдельно
- при соединении в запросе нескольких таблиц каждой таблице присваивается псевдоним, состоящий из первых (заглавных) букв слов, входящих в наименование таблицы. Псевдонимы пишутся маленькими буквами
- при соединении в запросе нескольких таблиц перед именем каждого поля через точку обязательно указывается псевдоним таблицы, из которой берется это поле
- если в выборку попадают поля с одинаковыми наименованиями, этим полям даются псевдонимы, состоящие из имени таблицы и имени поля. Имена таблиц пишутся в единственном числе без префикса типа объекта и проекта, также в них допускаются сокращения
- для имен полей в выборке могут использоваться псевдонимы в виде сокращений этих имен, либо расшифровывающие суть полей
Все сказанное для таблиц подходит и для написания запросов с использованием представлений, а также для создания самих представлений.
Использование данных правил позволяет:
- писать достаточно легко читаемые запросы
- сразу понимать, из какой таблицы взяты данные
- значительно укоротить тексты запросов
- свести к минимуму корректировку запроса при переименовании входящих в него таблиц (можно исправить только имя таблицы, но не менять ее псевдоним, хотя это и выходит за рамки описываемых правил)
1. Данные о студентах, находящихся в определенном семестре
SELECT s.ID,
p.ID AS PeopleID,
p.LastName,
p.FirstName,
p.SirName,
sp.Name AS SpecName,
sst.Name AS StatusName
FROM tStudents s INNER JOIN
tPeople ON p.ID = s.PeopleID INNER JOIN
tSpecialities sp ON sp.ID = s.SpecID INNER JOIN
tStudentStatusTypes sst ON s.ID = sst.ID
WHERE s.Semester = :Semester
ORDER BY p.LastName, p.FirstName, p.SirName
|
|
2. Актуальный персональный план указанного студента на весь срок обучения
SELECT pp.Semester,
s.Name AS SubjName,
pp.Result,
pp.ResultDate
FROM tSubjects s INNER JOIN
tPersonalPlans pp ON s.ID = pp.SubjectID
WHERE pp.StudentID = :StudentID AND pp.IsActual <> 0
ORDER BY pp.Semester, s.Name
|
|
3. Количество студентов по каждой специальности
SELECT sp.FullName, COUNT(*) as StudCount
FROM tSpecialities sp INNER JOIN
tStudents s ON sp.ID = s.SpecID
GROUP BY sp.FullName
ORDER BY sp.FullName
|
|
4. Результаты сдачи предмета
SELECT p.LastName,
p.FirstName,
p.SirName,
sp.Name AS SpecName,
pp.Result,
pp.ResultDate
FROM tPeople p INNER JOIN
tStudents s ON p.ID = s.PeopleID INNER JOIN
tSpecialities sp ON s.SpecID = sp.ID INNER JOIN
tPersonalPlans pp ON s.ID = pp.StudentID
WHERE pp.IsActual <> 0 AND
pp.SubjectID = :SubjectID AND
pp.Result Is Not Null
ORDER BY p.LastName, p.FirstName, p.SirName
|
|
Хранимые процедуры являются очень удобным инструментом, позволяющим изменять данные в базе данных, а также делать сложные выборки (имеются в виду хранимые процедуры, не изменяющие данные, а возвращающие наборы данных).
В названии хранимых процедур рекомендуется придерживаться следующих правил:
- название процедуры состоит из слов, кратко описывающих основное действие этой процедуры
- процедуры, основной задачей которых является добавление записей или групп записей, начинаются со слова "Add", "Insert" или "Create"
- процедуры, изменяющие записи, начинаются со слова "Update" или "Modify"
- процедуры, удаляющие записи, начинаются со слова "Delete" или "Erase"
- процедуры, основной задачей которых является возврат параметров или наборов данных, начинаются со слова "Get"
- процедуры, устанавливающие параметры, начинаются со слова "Set"
- остальные процедуры именуются в соответствии с выполняемыми функциями без префиксов, либо с префиксами, уточняющими их смысл
Допускается и иная схема именования процедур. Сначала идет название процедуры, а в конце добавляется слово, отражающее смысл основного действия.
Для названий параметров процедур предлагается следующее правило. Название параметров должно начинаться с префикса, состоящего из первых (заглавных) букв слов в названии процедуры (префиксы пишутся маленькими буквами), после префикса может идти символ подчеркивания ("_"), а затем — собственно название параметра, отражающее его смысл. Таким образом, обеспечивается достаточно высокий уровень уникальности имен параметров, что актуально при вызове одной процедуры из другой.
1. Создание записи о человеке
Имя | pCreatePeople или pPeopleCreate |
Параметры | cp_ID | Выходной | Идентификатор созданного человека |
| cp_LastName | Входной | Фамилия |
| cp_FirstName | Входной | Имя |
| cp_SirName | Входной | Отчество |
| cp_Sex | Входной | Пол |
| cp_BirthDate | Входной | Дата рождения |
| cp_Passport | Входной | Паспорт |
| cp_Address | Входной | Адрес |
| cp_Photo | Входной | Фотография |
|
2. Изменение записи о человеке
Имя | pModifyPeople или pPeopleModify |
Параметры | mp_ID | Входной | Идентификатор изменяемой записи |
| mp_LastName | Входной | Фамилия |
| mp_FirstName | Входной | Имя |
| mp_SirName | Входной | Отчество |
| mp_Sex | Входной | Пол |
| mp_BirthDate | Входной | Дата рождения |
| mp_Passport | Входной | Паспорт |
| mp_Address | Входной | Адрес |
| mp_Photo | Входной | Фотография |
|
3. Создание/изменение записи о студенте
Имя | pCreateModifyStudent или pStudentCreateModify |
Параметры | cms_ID | Входной / Выходной | Идентификатор студента. Если не задан (NULL), создается новая запись в таблице "Студенты". Если задан, обновляется существующая запись |
| cms_PeopleID | Входной | Идентификатор человека. Если не задан (NULL), создается новая запись в таблице "Люди". Если задан, параметры человека игнорируются |
| cms_LastName | Входной | Фамилия |
| cms_FirstName | Входной | Имя |
| cms_SirName | Входной | Отчество |
| cms_Sex | Входной | Пол |
| cms_BirthDate | Входной | Дата рождения |
| cms_Passport | Входной | Паспорт |
| cms_Address | Входной | Адрес |
| cms_Photo | Входной | Фотография |
| cms_SpecID | Входной | Специальность |
| cms_Semester | Входной | Номер семестра |
| cms_StatusTypeID | Входной | Статус студента. Учитывается только при изменении записи. При создании записи всегда ставится "Абитуриент" |
|
4. Получение персонального плана
Имя | pGetPersonalPlan или pPersonalPlanGet |
Параметры | gpp_StudentID | Входной | Идентификатор студента |
|
Возвращает таблицу с персональным планом указанного студента.
5. Открытие персонального плана на следующий семестр
Имя | pOpenStudentSemester |
Параметры | oss_StudentID | Входной | Идентификатор студента |
| oss_NewSemester | Входной | Номер открываемого семестра |
|
В названии функций пользователей рекомендуется придерживаться только одного правила: название функции подчиняется общим правилам именования объектов.
Параметры функций именуются по правилам именования параметров процедур.
1. Получить ФИО
Имя | fFullName | |
Параметры | fn_LastName | Фамилия |
| fn_FirstName | Имя |
| fn_SirName | Отчество |
|
2. Получить количество пройденных предметов в текущем семестре
Имя | fPassedSubjectsQuant | |
Параметры | ssq_StudentID | Идентификатор студента |
|
Применение предлагаемых правил позволяет унифицировать пространство имен объектов базы данных и упростить работу с ними. На первый взгляд они могут показаться сложными, но на самом деле к ним быстро привыкаешь.
Данные правила были применены при разработке системы автоматизации работы реального ВУЗа, которая на данный момент времени охватывает все подразделения ВУЗа в головном учебном центре и во всех филиалах. Кроме того, данная система была внедрена в нескольких ВУЗах по России. Краткое описание системы можно найти по адресу: http://isu.tisbi.ru/booklet/.
[Моделирование БД]
Обсуждение материала [ 29-10-2009 04:33 ] 12 сообщений |