1.6. Именование

Отдельного разговора требует рассмотрение именование. Дело в том, что SQL Server достаточно лояльно относиться к именам таблиц. Например, вы можете использовать в качестве имен русские слова, и даже имена из нескольких слов. Только если имя состоит из нескольких слов, оно должно заключаться в квадратные скобки. Посмотрим на следующий пример:

CREATE TABLE Товары
(
  [Дата] datetime, 
  [Название товара] varchar(50),
  [Цена] money,
  [Количество] numeric(10, 2)
)

В данном случае все имена объектов имеют русские названия. Я заключил все русские названия в квадратные скобки, чтобы их явно было видно. В реальных условиях, я рекомендую все же назвать все английскими названиями.

С помощью квадратных скобок можно создавать поля и из зарезервированных слов. Например, если попытаться создать таблице с именем поля min, то сервер вернет ошибку, потому что это зарезервированное имя (есть такой оператор). Но если имя поля из одного не зарегистрированного слова заключить в квадратные скобки, то ошибки не будет.

Квадратными скобками нужно выделять и имена полей из нескольких слов. Если в примере выше убрать квадратные скобки с имени поля "Название товара", то сценарий закончит выполнение ошибкой.

1.7. Резюме

Давайте сведем всю рассмотренную в данной главе информацию и создадим базу данных из четырех таблиц:

  1. tbPeoples – в этой таблице будет храниться информация о сотрудниках;
  2. tbPositions – это справочник должностей. Несколько сотрудников могут иметь одинаковую должность. Например, даже небольшая организация может содержать в штате несколько водителей. Чтобы не писать в таблице у каждого сотрудника одну и ту же должность, достаточно только выбрать ее из справочника. К тому же, справочник будет иметь возможность отображение подчинения должностей, т.е. будет внешний ключ на саму таблицу должностей;
  3. tbPhoneNumbers – номера телефонов. Так как у одного сотрудника может быть несколько номеров (стационарный, сотовый, домашний), перенесем номера телефонов в отдельную таблицу;
  4. tbPhoneType - чтобы жизнь не казалась медом, добавим возможность отображения типа телефона (стационарный рабочий, стационарный домашний сотовый рабочий, сотовый собственный). Эта таблица также позволит не вводить для каждого телефона его тип буквами, а достаточно будет только выбрать нужный вариант из справочника.

В нашей базе данных два полноценных справочника для хранения должностей и для хранения типов телефонов. Справочники позволяют:

  • упростить работу операторам. Не надо каждый раз вводить названия, достаточно выбрать нужный номер из справочника;
  • уменьшить вероятность ошибок при вводе. При вводе символьной информации очень часто возникают ошибки. Особенно это проявляется в раскладках клавиатуры. Например, один пользователь может ввести слово «сотовый», и другой введет «сотовый», но SQL сервер будет воспринимать их по-разному. Вы не видите ошибки? На взгляд ее увидеть невозможно. Просто одно из слов может содержать первую букву в английской раскладке. Дело в том, что русская "с" и английская "с" выглядят одинаково и находятся на одной клавише. Пользователи очень часто начинают вводить на английском, потому видят, что ошиблись, стирают лишнее, переключаются в русскую раскладку и вводят заново. При этом, первая буква "с" остается в английской раскладке.
  • Уменьшить размер базы данных. В базе данных название телефона присутствует только один раз и занимает, например, 30 символов. Во всех строках номеров телефонов стоит только ссылка, которая занимает 4 байта, что намного меньше. Если отказаться от справочника, то в каждой строке номера телефона уже будет съедаться не 4 символа, а 30, для хранения полного названия типа телефона. Конечно, можно использовать varchar, который хранит реальное значение и не резервирует полный доступный размер, но лишних затрат все равно будет достаточно.

На рисунке 1.11 показано окно программы Enterprise Manager, которая входит в состав MS SQL Server и позволяет визуально работать с базой данных. Чтобы было удобно видеть структуру, я создал визуальную диаграмму и добавил в поля описания их предназначения.

Связь между таблицами персонала (tbPeoples) и должностями (tbPosition) происходит по схеме один ко многим. Одной строке из таблицы таблицы должностей соответствует множество строк из tbPeoples. Связь между персоналом и телефонами (tbPhoneNumbers) происходит по схеме один ко многим. Одной записи из таблицы персонала может соответствовать несколько номеров телефонов. Между номерами телефонов и их типами снова связь один ко многим – одному типу телефона соответствует много номеров.

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

Листинг 1.11. Создание базы тестовой данных

-- Удаляем базу данных
DROP DATABASE FlenovSQLBook
GO

-- Создаем базу данных
CREATE DATABASE FlenovSQLBook
GO

-- Переходим в базу данных телефонов
USE FlenovSQLBook

-- Создаем таблицу должностей
CREATE TABLE tbPosition
(
 -- Описание полей
 idPosition int IDENTITY(1,1), 
 idParentPosition int, 
 vcPositionName varchar(30),  

 -- Описание ограничений
 CONSTRAINT PK_idPosition PRIMARY KEY (idPosition),
 CONSTRAINT FK_idParentPosition FOREIGN KEY (idParentPosition)
   REFERENCES tbPosition (idPosition)
)

-- Создаем таблицу работников
CREATE TABLE tbPeoples
(
  -- Описание полей
  idPeoples int IDENTITY(1, 1),
  vcFamil varchar(50),
  vcName varchar(50),
  vcSurname varchar(50),
  idPosition int, 
  dDateBirthDay datetime, 

  -- Описание ключей
  CONSTRAINT PK_idPeoples PRIMARY KEY (idPeoples),
  CONSTRAINT FK_idPosition FOREIGN KEY (idPosition)
     REFERENCES tbPosition (idPosition), 

  -- Описание ограничений
  CONSTRAINT check_dDateBirthDay CHECK (dDateBirthDay<getdate())
)

-- Создаем таблицу типов телефонов
CREATE TABLE tbPhoneType
(
 idPhoneType int IDENTITY(1, 1),
 vcTypeName varchar(20),

  -- Описание ограничений
 CONSTRAINT PK_idPhoneType PRIMARY KEY (idPhoneType),
)

-- Создаем таблицу телефонов
CREATE TABLE tbPhoneNumbers
(
  -- Описание полей
  idPhoneNumbers int IDENTITY(1, 1),
  idPhoneType int, 
  idPeoples int,
  vcPhoneNumber varchar(15),

  -- Описание ключей
  CONSTRAINT PK_idPhoneNumbers PRIMARY KEY (idPhoneNumbers),
  CONSTRAINT FK_idPhoneType FOREIGN KEY (idPhoneType)
     REFERENCES tbPhoneType (idPhoneType), 
  CONSTRAINT FK_idPeoples FOREIGN KEY (idPeoples)
     REFERENCES tbPeoples (idPeoples), 

  -- Описание ограничений
  CONSTRAINT check_vcPhonenumber CHECK (vcPhonenumber LIKE 
    '([0-9][0-9][0-9]) [0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]')
)

Помимо этого, создадим еще и таблицу с русскими именами, которая не связана с предыдущими таблицами:

CREATE TABLE Товары
(
  [Дата] datetime, 
  [Название товара] varchar(50),
  [Цена] money,
  [Количество] numeric(10, 2)
)

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

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

Следующая глава

2. Transact-SQL Работа с данными

О блоге

Программист, автор нескольких книг серии глазами хакера и просто блогер. Интересуюсь безопасностью, хотя хакером себя не считаю

Обратная связь

Без проблем вступаю в неразборчивые разговоры по e-mail. Стараюсь отвечать на письма всех читателей вне зависимости от страны проживания, вероисповедания, на русском или английском языке.

Пишите мне