# Лабораторная работа "Создание ER-диаграммы по своей предметной области" В прошлом году я предупреждал, что каждому нужно определиться с предметной областью, по которой он будет писать лабы и курсовые проекты. ## Основные типы данных MySQL и рекомендации по их использованию ### Числовые типы * `INT()` - целое число (32-разрядное). >Указание размера в скобках является справочной информацией для инструментов и не влияет на диапазон значений или объем памяти, занимаемый данными. Ещё есть целочисленные типы: - `TINYINT` - аналог байта (8 бит) - `SMALLINT` - слово (16 бит) - `MEDIUMINT` - прямого аналога в C# нет, занимает 24 бита - `BIGINT` - длинное целое (64 бита) * `FLOAT` и `DOUBLE` - `32` и `64` разрядные числа с плавающей запятой * `DECIMAL(M,D)` и `NUMERIC(M,D)` - пишут что обозначают одно и то же (синонимы): числа с фиксированной запятой, наиболее понятный пример - деньги, мы не можем оперировать долями копеек. ### Символьные типы * `VARCHAR()` - хранит строки переменной длины до 65 535 символов. В скобках мы указываем максимальную длину, которую может занимать строка. Первый байт или два (зависит от заявленной максимальной длины) в структуре данных этого типа хранят фактическую длину сохраненных данных. Рекомендуется использовать этот тип данных, если заранее не известна точная длина данных (ФИО, Адрес, название товара и т.п.) * `CHAR()` - хранит строку фиксированного размера (который задается при объявлении). Рекомендуется для данных у которых длина известна (номер паспорта, ИНН, СНИЛС и т.п.) * `TEXT` - используется для хранения больших (и не только) строк, например, текст статьи - `TINYINT` - до 255 байт - `TEXT` - до 64 Кбайт - `MEDUIMTEXT` - до 16 Мбайт - `LONGTEXT` - до 4 Гбайт ### Дата/время * `DATE` - Только дата в формате `YYYY-MM-DD`. Допустимые значения от `1000-01-01` до `9999-12-31` * `DATETIME` - Дата и время в формате `YYYY-MM-DD HH:MM:SS`. * `TIMESTAMP` - Время хранится в виде количества секунд, прошедших с 1 января 1970 года по гринвичу. Занимает в два раза меньше места, чем тип `DATETIME`. Но при этом диапазон ограничен значениями от `1970-01-01 00:00:01` до `2038-01-09 03:14:07` * `TIME` - Только время в формате `HH:MM:SS` * `YEAR` - Только год в формате `YYYY` или `YY`. Как видно, полную дату можно хранить либо в `DATETIME`, либо в `TIMESTAMP`, в чём разница? `DATETIME` хранится в виде строки, т.е. он более человекочитаем, но требует больше ресурсов при сравнении (поиск по строке работает дольше, чем сравнение двух целых). `TIMESTAMP` хранится как целое и его, соответственно выгоднее использовать там, где нужно часто сравнивать даты (но обратите внимание на максимальную поддерживаемую дату) ### Логический тип В MySQL нет выделенного типа данных под логический, вместо него обычно используют `TINYINT(1)` ## Задание 1. Подготовьте описание своей предметной области (произвольный текст) 1. Реализуйте ER-диаграмму по этой предметной области в программе MySQL Workbench. В диаграмме должно быть не менее 5 таблиц и обязательно оба типа связей ("один-ко-многим" и "многие-ко-многим") В репозитории опубликовать `readme.md`, который должен включать описание предметной области и ссылку на PDF-файл диаграммы. Также в репозиторий включить исходный файл диаграммы. Базу по разработанной диаграмме пока не создавайте - я ее проверю Допускается совместная работа, но в этом случае предметная область должна делиться на подсистемы (например, продажи продукции и складской учет) и каждый участник совместного репозитория должен работать со своей подсистемой (и публиковать изменения в репозиторий под своим именем) Этот репозиторий послужит основой для большого проекта, в следующих лабораторных мы напишем словарь данных, создадим DDL-скрипт, наборы данных, сделаем импорт...