mirror of
https://github.com/treffynnon/sqlstyle.guide.git
synced 2025-03-09 12:49:51 -05:00
Merge pull request #33 from denpatin/gh-pages
Fix typos and styling for Russian translation
This commit is contained in:
commit
8e3d6c40d7
1 changed files with 73 additions and 67 deletions
|
@ -3,19 +3,22 @@
|
||||||
## Предисловие
|
## Предисловие
|
||||||
|
|
||||||
Вы можете использовать это руководство целиком, [сделать его форк][fork] или
|
Вы можете использовать это руководство целиком, [сделать его форк][fork] или
|
||||||
создать своё на его основе. Цель — определить, какой стиль вам подходит больше,
|
создать своё на его основе. Цель — определить, какой стиль вам подходит
|
||||||
и придерживаться его. Если вы хотите предложить изменение или исправить ошибку,
|
больше, и придерживаться его. Если вы хотите предложить изменение или
|
||||||
[откройте Issue][issue] или [создайте Pull Request][pull] на GitHub'е.
|
исправить ошибку, [откройте Issue][issue] или [создайте Pull Request][pull] на
|
||||||
|
GitHub'е.
|
||||||
|
|
||||||
Рекомендации, описанные в этом руководстве, во многом пересекаются с описанными
|
Рекомендации, описанные в этом руководстве, во многом пересекаются с
|
||||||
в книге Джо Селко «[Стиль программирования Джо Селко на SQL][celko-ru]»
|
описанными в книге Джо Селко
|
||||||
(оригинал: [SQL Programming Style][celko]). Это, в частности, найдут полезным
|
«[Стиль программирования Джо Селко на SQL][celko-ru]» (оригинал:
|
||||||
те, кто уже знаком с этой книгой. Тем не менее автор этого руководства в
|
[SQL Programming Style][celko]). Это, в частности, найдут полезным те, кто уже
|
||||||
некоторых аспектах более категоричен, нежели Джо Селко, а в других, напротив,
|
знаком с этой книгой. Тем не менее автор этого руководства в некоторых
|
||||||
более гибок. И, конечно, нельзя не отметить, что это руководство значительно
|
аспектах более категоричен, нежели Джо Селко, а в других, напротив, более
|
||||||
короче и лаконичнее [книги Селко][celko-ru] — здесь вы не встретите ни весёлых
|
гибок. И, конечно, нельзя не отметить, что это руководство значительно короче
|
||||||
историй из жизни, наглядно объясняющих, как и почему лучше не делать, ни длинных
|
и лаконичнее [книги Селко][celko-ru] — здесь вы не встретите ни весёлых
|
||||||
повествований, мотивирующих на использование той или иной рекомендации.
|
историй из жизни, наглядно объясняющих, как и почему лучше не делать, ни
|
||||||
|
длинных повествований, мотивирующих на использование той или иной
|
||||||
|
рекомендации.
|
||||||
|
|
||||||
Руководство написано в [формате Markdown][dl-md], что позволяет легко включить
|
Руководство написано в [формате Markdown][dl-md], что позволяет легко включить
|
||||||
его в проект или просто сослаться на него оттуда, что гораздо удобнее, нежели
|
его в проект или просто сослаться на него оттуда, что гораздо удобнее, нежели
|
||||||
|
@ -36,17 +39,18 @@
|
||||||
`YYYY-MM-DD HH:MM:SS.SSSSS`.
|
`YYYY-MM-DD HH:MM:SS.SSSSS`.
|
||||||
* **Функции SQL**. Стандартные вместо специфичных (определяемых поставщиком) с
|
* **Функции SQL**. Стандартные вместо специфичных (определяемых поставщиком) с
|
||||||
целью лучшей переносимости.
|
целью лучшей переносимости.
|
||||||
* **Код**. Лаконичный и без излишеств, как например: ненужные кавычки или скобки
|
* **Код**. Лаконичный и без излишеств, как например: ненужные кавычки или
|
||||||
или неуместное использование оператора `WHERE`.
|
скобки или неуместное использование оператора `WHERE`.
|
||||||
* **Комментарии**. Предпочтительно в [стиле C][c-style-comments-ru] — `/*`
|
* **Комментарии**. Предпочтительно в [стиле C][c-style-comments-ru] — `/*`
|
||||||
(начало) и `*/` (конец). Либо `--` перед комментарием, тогда окончанием будет
|
(начало) и `*/` (конец). Либо `--` перед комментарием, тогда окончанием
|
||||||
новая строка.
|
будет новая строка.
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
SELECT file_hash -- stored ssdeep hash
|
SELECT file_hash -- stored ssdeep hash
|
||||||
FROM file_system
|
FROM file_system
|
||||||
WHERE file_name = '.vimrc';
|
WHERE file_name = '.vimrc';
|
||||||
```
|
```
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
/* Updating the file record after writing to the file */
|
/* Updating the file record after writing to the file */
|
||||||
UPDATE file_system
|
UPDATE file_system
|
||||||
|
@ -58,8 +62,8 @@ UPDATE file_system
|
||||||
### Плохой стиль
|
### Плохой стиль
|
||||||
|
|
||||||
* **CamelCase**. Неудобочитаем.
|
* **CamelCase**. Неудобочитаем.
|
||||||
* **Префиксы и [венгерская нотация][hungarian-notation-ru]**. Префиксы наподобие
|
* **Префиксы и [венгерская нотация][hungarian-notation-ru]**. Префиксы
|
||||||
`sp_` или `tbl_` избыточны.
|
наподобие `sp_` или `tbl_` избыточны.
|
||||||
* **Множественное число**. Лучше использовать более естественно звучащие
|
* **Множественное число**. Лучше использовать более естественно звучащие
|
||||||
собирательные понятия. Например, `staff` вместо `employees` или `people`
|
собирательные понятия. Например, `staff` вместо `employees` или `people`
|
||||||
вместо `individuals`.
|
вместо `individuals`.
|
||||||
|
@ -74,16 +78,16 @@ UPDATE file_system
|
||||||
### Общее
|
### Общее
|
||||||
|
|
||||||
* **Убедитесь** в том, что имя уникально и его нет в
|
* **Убедитесь** в том, что имя уникально и его нет в
|
||||||
[списке зарезервированных ключевых слов][reserved-keywords].
|
[списке зарезервированных ключевых слов][reserved-keywords].
|
||||||
* **Ограничивайте** длину имени 30 байтами (это 30 символов, если не
|
* **Ограничивайте** длину имени 30 байтами (это 30 символов, если не
|
||||||
используется многобайтовый набор символов).
|
используется многобайтный набор символов).
|
||||||
* **Начинайте** имена с буквы и **не заканчивайте** их символом подчёркивания.
|
* **Начинайте** имена с буквы и **не заканчивайте** их символом подчёркивания.
|
||||||
* **Используйте** в именах только буквы, цифры и символ подчёркивания.
|
* **Используйте** в именах только буквы, цифры и символ подчёркивания.
|
||||||
* **Избегайте** нескольких подряд идущих символов подчёркивания.
|
* **Избегайте** нескольких подряд идущих символов подчёркивания.
|
||||||
* **Используйте** символ подчёркивания там, где вы бы поставили пробел в
|
* **Используйте** символ подчёркивания там, где вы бы поставили пробел в
|
||||||
реальной жизни (например, `first name` станет `first_name`).
|
реальной жизни (например, `first name` станет `first_name`).
|
||||||
* **Избегайте** сокращений. Если их всё же нужно использовать, убедитесь в том,
|
* **Избегайте** сокращений. Если их всё же нужно использовать, убедитесь в
|
||||||
что они общепонятны.
|
том, что они общепонятны.
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
SELECT first_name
|
SELECT first_name
|
||||||
|
@ -109,13 +113,13 @@ SELECT first_name
|
||||||
* По возможности **не используйте** `id` в качестве первичного идентификатора
|
* По возможности **не используйте** `id` в качестве первичного идентификатора
|
||||||
таблицы.
|
таблицы.
|
||||||
* **Не создавайте** в таблице столбцов с таким же названием, как у неё самой.
|
* **Не создавайте** в таблице столбцов с таким же названием, как у неё самой.
|
||||||
* Названия **всегда пишите** со строчной буквы. Могут быть исключения, например
|
* Названия **всегда пишите** со строчной буквы. Могут быть исключения,
|
||||||
использование имени собственного.
|
например использование имени собственного.
|
||||||
|
|
||||||
### Псевдонимы/корреляции
|
### Псевдонимы/корреляции
|
||||||
|
|
||||||
* **Должны** так или иначе быть связаны с объектами или выражениями, псевдонимом
|
* **Должны** так или иначе быть связаны с объектами или выражениями,
|
||||||
которых они являются.
|
псевдонимом которых они являются.
|
||||||
* Имя корреляции **обычно составляется** из первых букв каждого слова в имени
|
* Имя корреляции **обычно составляется** из первых букв каждого слова в имени
|
||||||
объекта.
|
объекта.
|
||||||
* **Добавьте** цифру к имени, если такое уже существует.
|
* **Добавьте** цифру к имени, если такое уже существует.
|
||||||
|
@ -129,6 +133,7 @@ SELECT first_name AS fn
|
||||||
JOIN students AS s2
|
JOIN students AS s2
|
||||||
ON s2.mentor_id = s1.staff_num;
|
ON s2.mentor_id = s1.staff_num;
|
||||||
```
|
```
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
SELECT SUM(s.monitor_tally) AS monitor_total
|
SELECT SUM(s.monitor_tally) AS monitor_total
|
||||||
FROM staff AS s;
|
FROM staff AS s;
|
||||||
|
@ -160,15 +165,15 @@ SELECT SUM(s.monitor_tally) AS monitor_total
|
||||||
|
|
||||||
### Зарезервированные слова
|
### Зарезервированные слова
|
||||||
|
|
||||||
[Зареервированные ключевые слова][reserved-keywords] всегда пишите прописными
|
[Зарезервированные ключевые слова][reserved-keywords] всегда пишите прописными
|
||||||
буквами, например `SELECT`, `WHERE`.
|
буквами, например `SELECT`, `WHERE`.
|
||||||
|
|
||||||
Не испольуйте сокращённый вариант ключевого слова, если имеется полный.
|
Не используйте сокращённый вариант ключевого слова, если имеется полный.
|
||||||
Например, используйте `ABSOLUTE` вместо `ABS`.
|
Например, используйте `ABSOLUTE` вместо `ABS`.
|
||||||
|
|
||||||
Не испольуйте специфичные для какого-либо поставщика СУБД ключевые слова, если в
|
Не используйте специфичные для какого-либо поставщика СУБД ключевые слова,
|
||||||
ANSI SQL есть ключевые слова, выполняющие такие же функции. Это сделает ваш код
|
если в ANSI SQL есть ключевые слова, выполняющие такие же функции. Это сделает
|
||||||
более переносимым.
|
ваш код более переносимым.
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
SELECT model_num
|
SELECT model_num
|
||||||
|
@ -183,10 +188,10 @@ SELECT model_num
|
||||||
|
|
||||||
#### Пробелы
|
#### Пробелы
|
||||||
|
|
||||||
Можно и нужно использовать пробелы для выравнивания основных ключевых слов по их
|
Можно и нужно использовать пробелы для выравнивания основных ключевых слов по
|
||||||
правому краю. В типографике получающиеся таким образом «[коридоры][rivers-ru]»
|
их правому краю. В типографике получающиеся таким образом
|
||||||
стараются избегать, в то же время в нашем случае они, напротив, помогают лучше
|
«[коридоры][rivers-ru]» стараются избегать, в то же время в нашем случае они,
|
||||||
вычленять важные ключевые слова.
|
напротив, помогают лучше вычленять важные ключевые слова.
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
(SELECT f.species_name,
|
(SELECT f.species_name,
|
||||||
|
@ -285,8 +290,8 @@ SELECT r.last_name
|
||||||
|
|
||||||
Подзапросы тоже должны быть выровнены по правому краю «коридора», а внутри них
|
Подзапросы тоже должны быть выровнены по правому краю «коридора», а внутри них
|
||||||
самих применяются те же правила форматирования, что и в любом другом запросе.
|
самих применяются те же правила форматирования, что и в любом другом запросе.
|
||||||
Если используются вложенные подзапросы, может иметь смысл поставить закрывающую
|
Если используются вложенные подзапросы, может иметь смысл поставить
|
||||||
скобку на новой строке ровно под парной ей открывающей скобкой.
|
закрывающую скобку на новой строке ровно под парной ей открывающей скобкой.
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
SELECT r.last_name,
|
SELECT r.last_name,
|
||||||
|
@ -307,8 +312,8 @@ SELECT r.last_name,
|
||||||
* **Используйте** `BETWEEN`, где возможно, вместо нагромождения условий `AND`.
|
* **Используйте** `BETWEEN`, где возможно, вместо нагромождения условий `AND`.
|
||||||
* Таким же образом старайтесь **использовать** `IN()` вместо `OR`.
|
* Таким же образом старайтесь **использовать** `IN()` вместо `OR`.
|
||||||
* **Используйте** `CASE`, если значение должно быть интерпретировано до
|
* **Используйте** `CASE`, если значение должно быть интерпретировано до
|
||||||
окончания выполнения запроса. С помощью `CASE` можно также формировать сложные
|
окончания выполнения запроса. С помощью `CASE` можно также формировать
|
||||||
логические структуры.
|
сложные логические структуры.
|
||||||
* По возможности **избегайте** использования `UNION` и временных таблиц.
|
* По возможности **избегайте** использования `UNION` и временных таблиц.
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
|
@ -332,20 +337,20 @@ SELECT CASE postcode
|
||||||
### Типы данных
|
### Типы данных
|
||||||
|
|
||||||
* По возможности **не используйте** специфичные для той или иной СУБД типы
|
* По возможности **не используйте** специфичные для той или иной СУБД типы
|
||||||
данных. Это может негативно сказаться на переносимости, а также этих типов может
|
данных. Это может негативно сказаться на переносимости, а также этих типов
|
||||||
не оказаться в старых версиях этих же СУБД.
|
может не оказаться в старых версиях этих же СУБД.
|
||||||
* Для работы с плавающей точкой **используйте** только `REAL` или `FLOAT`, но
|
* Для работы с плавающей точкой **используйте** только `REAL` или `FLOAT`, но
|
||||||
где нет необходимости в подобных вычислениях, всегда **используйте** `NUMERIC`
|
где нет необходимости в подобных вычислениях, всегда **используйте**
|
||||||
и `DECIMAL`. Ошибки округления в операциях с плавающей точкой могут оказаться
|
`NUMERIC` и `DECIMAL`. Ошибки округления в операциях с плавающей точкой
|
||||||
очень некстати.
|
могут оказаться очень некстати.
|
||||||
|
|
||||||
### Значения по умолчанию
|
### Значения по умолчанию
|
||||||
|
|
||||||
* Значение по умолчанию всегда должно **совпадать** по типу со столбцом. Если,
|
* Значение по умолчанию всегда должно **совпадать** по типу со столбцом. Если,
|
||||||
скажем, столбец объявлен как `DECIMAL`, не нужно в качестве умолчания
|
скажем, столбец объявлен как `DECIMAL`, не нужно в качестве умолчания
|
||||||
указывать значение типа `INTEGER`.
|
указывать значение типа `INTEGER`.
|
||||||
* Значения по умолчанию должны располагаться **после** объявления типа столбца и
|
* Значения по умолчанию должны располагаться **после** объявления типа столбца
|
||||||
**перед** пометкой `NOT NULL`.
|
и **перед** пометкой `NOT NULL`.
|
||||||
|
|
||||||
### Ограничения и ключи
|
### Ограничения и ключи
|
||||||
|
|
||||||
|
@ -360,15 +365,16 @@ SELECT CASE postcode
|
||||||
целостность данных.
|
целостность данных.
|
||||||
|
|
||||||
1. Ключ должен быть в какой-то степени уникальным.
|
1. Ключ должен быть в какой-то степени уникальным.
|
||||||
2. Должна быть согласованность по типу данных для значения во всей схеме, а
|
1. Должна быть согласованность по типу данных для значения во всей схеме, а
|
||||||
также чем ниже вероятность того, что это изменится в будущем, тем лучше.
|
также чем ниже вероятность того, что это изменится в будущем, тем лучше.
|
||||||
3. Можно ли проверить значение на соответствие стандарту (например, ISO)?
|
1. Можно ли проверить значение на соответствие стандарту (например, ISO)?
|
||||||
4. Ключ должен быть как можно проще, чтобы можно было без трудностей
|
1. Ключ должен быть как можно проще, чтобы можно было без трудностей
|
||||||
использовать составные ключи.
|
использовать составные ключи.
|
||||||
|
|
||||||
Это своего рода конвенции, которые нужно сформулировать при проектировании базы
|
Это своего рода конвенции, которые нужно сформулировать при проектировании
|
||||||
данных. Если требования впоследствии будут разрастаться, можно и нужно вносить
|
базы данных. Если требования впоследствии будут разрастаться, можно и нужно
|
||||||
изменения в структуру базы, чтобы поддерживать её в актуальном состоянии.
|
вносить изменения в структуру базы, чтобы поддерживать её в актуальном
|
||||||
|
состоянии.
|
||||||
|
|
||||||
#### Ограничения
|
#### Ограничения
|
||||||
|
|
||||||
|
@ -379,26 +385,26 @@ SELECT CASE postcode
|
||||||
|
|
||||||
* У каждой таблицы **должен быть** хотя бы один ключ.
|
* У каждой таблицы **должен быть** хотя бы один ключ.
|
||||||
* Ограничениям нужно **присваивать** вразумительные имена. Для `UNIQUE`,
|
* Ограничениям нужно **присваивать** вразумительные имена. Для `UNIQUE`,
|
||||||
`PRIMARY KEY` и `FOREIGN KEY` подобные имена создаются автоматически, поэтому
|
`PRIMARY KEY` и `FOREIGN KEY` подобные имена создаются автоматически,
|
||||||
нужно позаботиться об остальных ограничениях.
|
поэтому нужно позаботиться об остальных ограничениях.
|
||||||
|
|
||||||
##### Расположение и порядок
|
##### Расположение и порядок
|
||||||
|
|
||||||
* Первичный ключ должен быть **объявлен** в самом начале, сразу после оператора
|
* Первичный ключ должен быть **объявлен** в самом начале, сразу после
|
||||||
`CREATE TABLE`.
|
оператора `CREATE TABLE`.
|
||||||
* Ограничения должны быть **объявлены** строго ниже столбца, с которым они
|
* Ограничения должны быть **объявлены** строго ниже столбца, с которым они
|
||||||
связаны. Расставьте отступы так, чтобы объявление ограничения начиналось после
|
связаны. Расставьте отступы так, чтобы объявление ограничения начиналось
|
||||||
названия столбца.
|
после названия столбца.
|
||||||
* В случае ограничений, затрагивающих несколько столбцов, старайтесь
|
* В случае ограничений, затрагивающих несколько столбцов, старайтесь
|
||||||
**объявлять** их как можно ближе к описанию последнего из них. В крайнем
|
**объявлять** их как можно ближе к описанию последнего из них. В крайнем
|
||||||
случае объявляйте ограничение в конце тела `CREATE TABLE`.
|
случае объявляйте ограничение в конце тела `CREATE TABLE`.
|
||||||
* Ограничения целостности уровня таблицы должны **располагаться** в конце.
|
* Ограничения целостности уровня таблицы должны **располагаться** в конце.
|
||||||
* **Используйте** алфавитный порядок там, где `ON DELETE` предшествует
|
* **Используйте** алфавитный порядок там, где `ON DELETE` предшествует
|
||||||
`ON UPDATE`.
|
`ON UPDATE`.
|
||||||
* Внутри запроса можно **выравнивать** каждый уровень по-своему. Например, можно
|
* Внутри запроса можно **выравнивать** каждый уровень по-своему. Например,
|
||||||
добавить отступы после названия столбцов, чтобы типы данных начинались с одной
|
можно добавить отступы после названия столбцов, чтобы типы данных начинались
|
||||||
позиции, а затем ещё добавить отступов в нужном количестве, чтобы все
|
с одной позиции, а затем ещё добавить отступов в нужном количестве, чтобы
|
||||||
объявления `NOT NULL` тоже были выровнены по левому краю. Подобное
|
все объявления `NOT NULL` тоже были выровнены по левому краю. Подобное
|
||||||
форматирование позволит быстрее ориентироваться в коде.
|
форматирование позволит быстрее ориентироваться в коде.
|
||||||
|
|
||||||
##### Валидация
|
##### Валидация
|
||||||
|
@ -406,9 +412,9 @@ SELECT CASE postcode
|
||||||
* **Используйте** `LIKE` и `SIMILAR TO` для обеспечения целостности строк с
|
* **Используйте** `LIKE` и `SIMILAR TO` для обеспечения целостности строк с
|
||||||
известным форматом.
|
известным форматом.
|
||||||
* Если диапазон числовых значений для столбца известен, **используйте**
|
* Если диапазон числовых значений для столбца известен, **используйте**
|
||||||
`CHECK()` для предотвращения внесения в базу некорректных данных или скрытого
|
`CHECK()` для предотвращения внесения в базу некорректных данных или
|
||||||
отсечения части значения слишком больших данных. Обычно проверка делается на
|
скрытого отсечения части значения слишком больших данных. Обычно проверка
|
||||||
то, что значение больше нуля.
|
делается на то, что значение больше нуля.
|
||||||
* `CHECK()` должен быть **объявлен** как отдельное ограничение для упрощения
|
* `CHECK()` должен быть **объявлен** как отдельное ограничение для упрощения
|
||||||
последующей отладки.
|
последующей отладки.
|
||||||
|
|
||||||
|
@ -448,8 +454,8 @@ CREATE TABLE staff (
|
||||||
|
|
||||||
### Список зарезервированных ключевых слов
|
### Список зарезервированных ключевых слов
|
||||||
|
|
||||||
Список зарезервированных ключевых слов ANSI SQL (92, 99 and 2003), MySQL версий
|
Список зарезервированных ключевых слов ANSI SQL (92, 99 and 2003), MySQL
|
||||||
с 3 по 5.x, PostgreSQL 8.1, MS SQL Server 2000, MS ODBC и Oracle 10.2.
|
версий с 3 по 5.x, PostgreSQL 8.1, MS SQL Server 2000, MS ODBC и Oracle 10.2.
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
A
|
A
|
||||||
|
|
Loading…
Reference in a new issue