another_dream
@another_dream
Backend-разработчик, Laravel/ZF2/Yii2

Как составить сложный SQL запрос на создание таблиц со связями и объединением запросов?

Собственно задача:

Для городской библиотеки Простоквашино необходимо спроектировать структуру базы данных для системы учета читателей. Система должна хранить информацию о читателях и взятых ими книгах, а также информацию обо всех книгах в целом.

Структуру базы описать в виде SQL-скрипта создания нужных таблиц и связей.

Информация о книге

* Название - текст

* Автор - текст

* Статус = [свободна, взята]

* Кем взята, если взята

* Когда взята, если взята - дата

* До какого числа, если взята - дата

Если книга имеется более чем в одном экземпляре, это необходимо отразить в базе.

Информация о читателе

* Имя - текст

* Фамилия - текст

* Служебная информация = [постоянный читатель, редкий читатель, читатель только читального зала]

Информация о взятых книгах

Какой документ был предъявлен при выдаче книги = [Усы, Лапы, Хвост]

Информация о документах

Усы:

* серия документа - 4 цифры, обязательно к заполнению

* номер документа - 6 цифр, обязательно к заполнению

* кем выдан - текст

* когда выдан - дата

Лапы:

* серия документа - набор из цифр и латинских букв длиной от 2 до 5 символов, необязательно к заполнению

* номер документа - набор из цифр и латинских букв длиной от 6 до 8 символов, обязательно к заполнению

* кем выдан - текст

Хвост:

* номер документа - набор из цифр и латинских букв длиной от 6 до 8 символов, обязательно к заполнению

* дата начала срока действия - дата

* дата окончания срока действия – дата


Попытался что-то написать, но сильно сомневаюсь в корректности. Особенно не понятна последняя часть с разными видами данных и условий для документов. Спасибо.

UPD.
Что получилось самостоятельно на данный момент:
CREATE TABLE books ( book_id int (10) AUTO_INCREMENT NOT NULL, book_name VARCHAR(255) NOT NULL, book_author VARCHAR (255) NOT NULL, book_status ENUM (‘Y’,’N’) NOT NULL default(Y), book_owner INT(11), book_take_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, book_return_date DATETIME NOT NULL, FOREIGN KEY (book_owner) REFERENCES users (user_id)))
UNION
CREATE TABLE users ( user_id int (10) AUTO_INCREMENT NOT NULL, user_firstname VARCHAR(255) NOT NULL, user_lastname VARCHAR (255) NOT NULL, user_info ENUM(‘regular_reader’, ’rare_reader’ , ’reading_room’) NOT NULL))
UNION
CREATE TABLE busy_book ( id int (10) AUTO_INCREMENT NOT NULL, bbook_id INT(11) NOT NULL, bbook_document VARCHAR (255) NOT NULL, user_info ENUM(‘regular_reader’, ’rare_reader’ , ’reading_room’) NOT NULL, FOREIGN KEY (bbook_id) REFERENCES books(book_id))

Дальше понял, что уже все не так :(
  • Вопрос задан
  • 3081 просмотр
Решения вопроса 3
pi314
@pi314
Президент Солнечной системы и окрестностей
offtop: откуда в деревне Простоквашино взялась городская библиотека?

А по сути - два соображения:

1. Скрипты создания таблиц некорректно называть SQL, т.к. SQL - язык запросов к данным, а его расширение для манипуляции структурой БД, на котором пишутся эти скрипты, называется DDL (Data Definition Language).

2. И, наконец, с непривычки решать такие задачи лучше графически... А потом уже писать скрипты.
Ответ написан
Serhioromano
@Serhioromano
Web Developer
Зачем использовать UNION? нужно просто создавать таблици одну за другой и правильно расставить FOREIGN KEY.

Тка же учтите что таблици должны быть типа Innodb так как MyISAM не поддреживает FOREIGN KEY.

Но лучше всего скачайте MySQL Workbench и там визуально сделайте вашу базу, на выходе получите SQL запрос который ее создает, со всемми ссылками с поля на поле.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы