1
0
Fork 0
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:
Simon Holywell 2017-12-07 16:43:16 +10:00 committed by GitHub
commit 8e3d6c40d7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -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