SQL, базы данных

1. Форматирование SQL-запросов

Запросы длиной более 50 символов (примерно) рекомендуется разбивать на несколько строк, подгоняя текст по горизонтали. Например так:


SELECT fields
  FROM tables t
 WHERE conditions
   AND more conditions
 GROUP BY fields
 ORDER BY fields
 LIMIT limits

или так:


SELECT
    fields
FROM
    tables t
WHERE
    conditions
AND
    more conditions
GROUP BY
    fields
ORDER BY
    fields
LIMIT
    limits

Для оформления строки с SQL-кодом используются кавычки q// или qq//. Как и в случае обычных одинарных и двойных кавычек, если интерполяция внутри строки не нужна (т. е. в случае SQL почти всегда), то лучше использовать q//.
Примеры:

$dbh->do(q/
    SQL
/);

$dbh->do(q/
    SQL
    /, undef, $value
);

$dbh->do(q/
    SQL
    /,
    undef, $value
);

$dbh->do(q/
    SQL
    /,
    undef,
    $value,
    ...
    $value10
);  

Запрещается использовать HEREDOC для оформления многострочного SQL, поскольку такой подход приводит к перестановке местами частей кода и ухудшает читаемость.

# Неправильно!!!
dbh_ro->selectrow_array( <<THEEND, undef, $service_id );
    SELECT state FROM services WHERE service_id=?;
THEEND

2. Ключевые слова — заглавными буквами

Все ключевые слова SQL записываются заглавными буквами, все наименование таблиц, полей, пользовательских функций — строчными.

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

При именовании таблиц и полей не допускается использование заглавных букв. Допускаются только строчные латинские буквы, цифры и знак подчёркивания.
Пример: "name_of_the_table".

4. Название таблицы должно точно отражать вид объектов, которые в ней хранятся

Хорошее правило для того, как придумывать названия таблиц БД (но то же правило относится к названию массивов / списков)...

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

Удачные примеры:
«users», «domains«, «domain_shop_categories», «user_doc_attachments».

Неудачные примеры:
«statistics» — понятно, что имеет отношение к статистике, но неясно что это за статистика и объекты какого вида хранятся в таблице;
«queue» — понятно, что это какая-то очередь, но что именно за очередь неясно и объекты какого вида хранятся в таблице.

5. Первичный ключ с именем "id" или "<tablename>_id"

В каждой таблице (за исключением таблиц, где необходимы составные ключи, например таблиц для обеспечения связей многие-ко-многим) обязательно должно быть поле с именем "id" (или "<tablename>_id") и типом INT, для которого должен быть создан первичный ключ:

id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY

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

6. Ссылочные поля — с именем "<tablename>_id"

Все поля, использующиеся для связи с другими таблицами по их первичному ключу, именуются как "<tablename>_id", где "<tablename>" — имя таблицы в единственном числе. Примеры наименований: domain_id, user_id.

7. В командах INSERT / REPLACE всегда перечисляйте имена полей таблицы

В командах INSERT / REPLACE всегда перечисляйте имена полей таблицы:

REPLACE INTO wf_parking (hostname, uri_path, html, fwdto) VALUES (?, ?, ?, ?) -- ПРАВИЛЬНО

Никогда не делайте так:

REPLACE INTO wf_parking VALUES (?, ?, ?, ?) -- НЕПРАВИЛЬНО! Не перечислен список полей

Если имена полей явно не перечислять, то при любом изменении состава полей таблицы, например, при добавлении нового поля — неминуемо получим ошибку («column count doesn't match value count» и т. п.).

Вернуться к списку