Евгений Колесников 3 jaren geleden
bovenliggende
commit
e91bedfc03
3 gewijzigde bestanden met toevoegingen van 276 en 0 verwijderingen
  1. 12 0
      articles/code_review.md
  2. 258 0
      articles/ddl.md
  3. 6 0
      readme.md

+ 12 - 0
articles/code_review.md

@@ -0,0 +1,12 @@
+будете задавать следующие вопросы — это поможет вам упростить и улучшить процесс code review:
+
+* У меня возникают трудности в понимании этого кода?
+* Есть ли в коде какое-либо сложное место, сложность которого можно уменьшить путем рефакторинга?
+* Являются ли имена классов интуитивно понятными и очевидно ли то, что они делают?
+* Есть ли какие-либо слишком большие классы?
+* Есть ли какие-либо слишком длинные методы?
+* Являются ли имена методов интуитивно понятными?
+* Код хорошо документирован?
+* Код хорошо протестирован?
+* Есть ли способы сделать этот код более эффективным?
+* Соответствует ли код стандартам оформления вашей команды?

+ 258 - 0
articles/ddl.md

@@ -0,0 +1,258 @@
+# DDL – Data Definition Language
+
+**Data Definition Language (DDL)** – это группа операторов **определения** данных. Другими словами, с помощью операторов, входящих в эту группы, мы определяем структуру базы данных и работаем с объектами этой базы, т.е. создаем, изменяем и удаляем их.
+
+В эту группу входят следующие операторы:
+
+* CREATE – используется для создания объектов базы данных;
+* ALTER – используется для изменения объектов базы данных;
+* DROP – используется для удаления объектов базы данных.
+
+>В MySQL регистронезависимый синтаксис, ключевые слова дальше написаны КАПСОМ только для читабельности.
+
+## CREATE DATABASE - создание базы данных
+
+```sql
+CREATE DATABASE [IF NOT EXISTS] db_name
+```
+
+Оператор `CREATE DATABASE` создает базу данных с указанным именем. Если база данных уже существует и не указан ключевой параметр `IF NOT EXISTS`, то возникает ошибка выполнения команды.
+
+Если в названии базы данных присутствуют пробелы или название совпадает с ключевым словом SQL, то название можно экранировать символами обратной кавычки (подобное экранирование применяется и к названиям других сущностей): 
+
+```
+CREATE DATABASE `database` 
+```
+
+## DROP DATABASE - удаление базы данных
+
+```
+DROP DATABASE [IF EXISTS] db_name
+```
+
+Оператор `DROP DATABASE` удаляет все таблицы в указанной базе данных (строго говоря не только таблицы, а все имеющиеся объекты) и саму базу.
+
+## CREATE TABLE - создание таблицы
+
+```
+CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)]
+[table_options]
+```
+
+* `TEMPORARY` - Будет создана временная таблица. Временная таблица автоматически удаляется по завершении соединения, а её имя действительно только в течение данного соединения. Это означает, что в двух разных соединениях могут использоваться временные таблицы с одинаковыми именами без конфликта друг с другом или с существующей таблицей с тем же именем (существующая таблица скрыта, пока не удалена временная таблица).
+
+* `tbl_name` - Название таблицы.
+
+    Имя таблицы может быть указано как `db_name.tbl_name`. Эта форма записи работает независимо от того, является ли указанная база данных текущей.
+
+* `(create_definition, ...)` описывает набор создаваемых сущностей (столбцы, индексы и т.д.):
+
+    * колонка (столбец)
+
+        синтаксис:
+
+        ```
+        col_name col_type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT]
+            [PRIMARY KEY]
+        ```
+
+        * `col_name` - название;
+
+        * `col_type` - тип данных;
+
+            * TINYINT[(length)] [UNSIGNED] [ZEROFILL]
+            * INT[(length)] [UNSIGNED] [ZEROFILL]
+            * INTEGER[(length)] [UNSIGNED] [ZEROFILL]
+            * DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL]
+            * FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL]
+            * DECIMAL(length,decimals) [UNSIGNED] [ZEROFILL]
+            * CHAR(length) [BINARY]
+            * VARCHAR(length) [BINARY]
+            * DATE
+            * TIME
+            * TIMESTAMP
+            * DATETIME
+            * TEXT
+            * ENUM(value1,value2,value3,...)
+            * SET(value1,value2,value3,...)
+
+        * `NOT NULL | NULL` - обязательность (по-умолчанию `NULL`);
+
+        * `DEFAULT default_value` - значение по-умолчанию;
+
+        * `AUTO_INCREMENT` - целочисленный столбец может иметь дополнительный атрибут AUTO_INCREMENT. При записи величины NULL (рекомендуется) или 0 в столбец AUTO_INCREMENT данный столбец устанавливается в значение `value+1`, где `value` представляет собой наибольшее для этого столбца значение в таблице на момент записи. Последовательность AUTO_INCREMENT начинается с `1`.
+
+        * `PRIMARY KEY` - представляет собой уникальный ключ KEY (KEY является синонимом для INDEX). Столбец с данным ключом должен быть определен как `NOT NULL`. В MySQL этот ключ называется PRIMARY (первичный). Таблица может иметь только один первичный ключ PRIMARY KEY (То есть если мы хотим создать составной первичный ключ, то надо создавать его отдельной сущностью). 
+
+        например:
+
+        ```sql
+        CREATE TABLE `test` (
+            `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY
+        )
+        ```
+
+    * первичный ключ (подразумевается составной, хотя никто не мешает использовать и одну колонку) 
+    
+        синтаксис:
+
+        ```
+        PRIMARY KEY (index_col_name,...)
+        ```
+
+        Например, аналог предыдущего запроса
+
+        ```sql
+        CREATE TABLE `test` (
+            `id` int(11) NOT NULL AUTO_INCREMENT,
+            PRIMARY KEY (`id`)
+        )
+        ```
+
+    * индекс
+    
+        синтаксис:
+
+        ```
+        KEY [index_name] (index_col_name,...)
+        ```
+
+        или
+
+        ```
+        INDEX [index_name] (index_col_name,...)
+        ```
+
+        или   
+        
+        ```
+        UNIQUE [INDEX] [index_name] (index_col_name,...)
+        ```
+
+        * `index_name` - название индекса
+
+        * `index_col_name` - название колонки, входящей в ключ индекса: `col_name [(length)]`. Содержимое колонки может быть обрезано по длине `length` 
+
+        Ключ `UNIQUE` может иметь только различающиеся значения. При попытке добавить новую строку с ключом, совпадающим с существующей строкой, возникает ошибка выполнения команды.
+
+    * внешний ключ
+
+        синтаксис:
+
+        ```
+        [CONSTRAINT index_name] FOREIGN KEY (index_col_name,...)
+            REFERENCES главная_таблица (столбец_главной_таблицы,...)
+            [ON DELETE reference_option]
+            [ON UPDATE reference_option]
+        ```
+
+        * `(index_col_name,...)` - список полей, являющихся частью составного ключа (чаще всего просто одно поле). Должен соответствовать списку полей главной таблицы в выражении `REFERENCES`.
+        * `главная_таблица` - название таблицы, с которой устанавливается связь
+        * `(столбец_главной_таблицы,...)` - поля главной таблицы, по которым устанавливается связь
+
+        Внешние ключи позволяют установить связи между таблицами. Внешний ключ устанавливается для столбцов из зависимой, подчиненной таблицы, и указывает на один из столбцов из главной таблицы. Как правило, внешний ключ указывает на первичный ключ из связанной главной таблицы.
+
+        Для создания ограничения внешнего ключа после `FOREIGN KEY` указывается столбец таблицы, который будет представляет внешний ключ. А после ключевого слова `REFERENCES` указывается имя связанной таблицы, а затем в скобках имя связанного столбца, на который будет указывать внешний ключ.
+
+        С помощью выражений `ON DELETE` и `ON UPDATE` можно установить действия, которые выполняются соответственно при удалении и изменении связанной строки из главной таблицы. В качестве действия могут использоваться следующие опции:
+
+        * `CASCADE`: автоматически удаляет или изменяет строки из зависимой таблицы при удалении или изменении связанных строк в главной таблице.
+
+        * `SET NULL`: при удалении или обновлении связанной строки из главной таблицы устанавливает для столбца внешнего ключа значение NULL. (В этом случае столбец внешнего ключа должен поддерживать установку NULL)
+
+        * `RESTRICT`: отклоняет удаление или изменение строк в главной таблице при наличии связанных строк в зависимой таблице.
+
+        * `NO ACTION`: то же самое, что и `RESTRICT` - действие по-умолчанию.
+
+        * `SET DEFAULT`: при удалении связанной строки из главной таблицы устанавливает для столбца внешнего ключа значение по умолчанию, которое задается с помощью атрибуты DEFAULT. Несмотря на то, что данная опция в принципе доступна, однако движок InnoDB не поддерживает данное выражение.
+
+        Например:
+
+        ```sql
+        -- таблица "склад"
+        CREATE TABLE `warehouse` (
+            `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+            `title` varchar(100) DEFAULT NULL,
+            `quantity` int(11) DEFAULT NULL,
+        )
+
+        -- таблица "продажи"
+        CREATE TABLE `sales` (
+            `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+            `warehouse_id` int(11) DEFAULT NULL,
+            `quantity` int(11) DEFAULT NULL,
+            CONSTRAINT `sales_FK` FOREIGN KEY (`warehouse_id`) REFERENCES `warehouse` (`id`)
+        )
+        ```
+
+* `table_options` - тут можно настроить тип таблицы, кодировку символов, параметры автоинкремента. Но обычно эти параметры не трогают и они наследуются от аналогичных параметров базы данных.
+
+## ALTER TABLE - изменение структуры таблицы
+
+```
+ALTER [IGNORE] TABLE tbl_name alter_spec [, alter_spec ...]
+```
+
+Оператор `ALTER TABLE` обеспечивает возможность изменять структуру существующей таблицы. Например, можно добавлять или удалять столбцы, создавать или уничтожать индексы или переименовывать столбцы либо саму таблицу.
+
+Оператор `ALTER TABLE` во время работы создает временную копию исходной таблицы. Требуемое изменение выполняется на копии, затем исходная таблица удаляется, а новая переименовывается. Так делается для того, чтобы в новую таблицу автоматически попадали все обновления кроме неудавшихся. 
+
+* Опция `IGNORE` управляет работой `ALTER TABLE` при наличии дубликатов уникальных ключей в новой таблице. Если опция `IGNORE` не задана, то для данной копии процесс прерывается и происходит откат назад. Если `IGNORE` указывается, тогда для строк с дубликатами уникальных ключей остается только первая строка, а остальные удаляются.
+
+* `alter_spec` - что меняется
+
+    * добавление новой колонки
+    
+        ```
+        ADD [COLUMN] create_definition [FIRST | AFTER column_name ]
+        ```
+
+        В `create_definition` используется тот же синтаксис, что и при создании таблицы.
+
+        По-умолчанию столбец добавляется в конец списка столбцов, но с помощью модификаторов `FIRST` и  `AFTER` можно разместить столбец в начале списка или после какого-то имеющегося столбца.
+
+    * добавление первичного ключа
+    
+        ```
+        ADD PRIMARY KEY (index_col_name,...)
+        ```
+
+    * добавление внешнего ключа
+
+        ```
+        ADD [CONSTRAINT symbol] FOREIGN KEY (index_col_name,...)
+            REFERENCES главная_таблица (столбец_главной_таблицы,...)
+            [ON DELETE reference_option]
+            [ON UPDATE reference_option]    
+        ```
+
+    * изменение существующей колонки
+
+        ```
+        ALTER [COLUMN] col_name [create_definition] {SET DEFAULT literal | DROP DEFAULT}    
+        ```
+
+        В целом параметры те же что и при создании, единствено отличается синтаксис добавления или удаления значения по-умолчанию.
+
+    * удаление колонки
+    
+        ```
+        DROP [COLUMN] col_name
+        ```
+
+    * удаление первичного ключа
+    
+        ```
+        DROP PRIMARY KEY
+        ```
+    * удаление индекса (в том числе внешнего ключа)
+    
+        ```
+        DROP INDEX index_name
+        ```
+
+---
+
+## Задание
+
+Написать скрипт, создающий базу данных по ERD вашего курсового проекта.

+ 6 - 0
readme.md

@@ -139,6 +139,8 @@ http://sergeyteplyakov.blogspot.com/2014/01/microsoft-fakes-state-verification.h
 
 1. [Основы SQL](./articles/sql_for_beginner.md)
 
+1. [DDL](./articles/ddl.md)
+
 1. [Создание базы данных. Импорт данных.](./articles/sql_import.md)
 
 1. [Импорт данных (вариант 22).](./articles/sql_import_22.md)
@@ -248,6 +250,8 @@ https://office-menu.ru/uroki-sql Уроки SQL
 
 <!-- переделать на asp.net -->
 
+<!-- TODO библиотека классов -->
+
 ## Тема 5.1.6. C#, разбор заданий предыдущих лет.
 
 <!-- 1. [Сессия 1. Создание БД. Импорт данных. Окно авторизации](./articles/wsr_1.md) -->
@@ -255,6 +259,8 @@ https://office-menu.ru/uroki-sql Уроки SQL
 
 2. [C# Параллельное программирование и асинхронность](./articles/cs_async_await.md)
 
+## [Code Review](./articles/code_review.md)
+
 <!-- 
 
 Создание базы данных