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» и т. п.).