Добавить в корзинуПозвонить
Найти в Дзене

SQL. Первый проект.

Допустим мы исследуем литературные тексты и задача требует, чтобы каждый абзац хранился отдельно. Чтобы можно было работать с большим количеством такого материала, лучше всего хранить его в базе данных. Попробуем использовать Postgres. Чтобы войти в консоль Postgres в командной строке Linux дадим команду: psql Далее команды выполняются в консоли psql
Создадим таблицу для хранения абзацев, с указанием автора и названия произведения. Начнем со сказок Пушкина: CREATE TABLE skazki (
paragraph INTEGER,
name VARCHAR,
autor VARCHAR,
text TEXT
); Здесь: В отличии от Windows в Unix-подобных системах регистр букв в именованных сущностях (именах переменных, полях и пр. ) имеет значение: name, Name и NAME- это три разных переменных или поля. Посмотрим что за структура получилась: \d skazki Результат работы команд мы здесь приводить в текстовом виде не будем, дзен их некрасиво форматирует. В необходимы случаях будут скришоты.
Запишем в таблицу несколько строф из сказки Пушкина:

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

Попробуем использовать Postgres.

Чтобы войти в консоль Postgres в командной строке Linux дадим команду:

psql

psql - лучший инструмент для работы с Postgres
psql - лучший инструмент для работы с Postgres
Далее команды выполняются в консоли psql


Создадим таблицу для хранения абзацев, с указанием автора и названия произведения. Начнем со сказок Пушкина:

CREATE TABLE skazki (
paragraph INTEGER,
name VARCHAR,
autor VARCHAR,
text TEXT
);

Здесь:

  • Заглавными буквами написаны ключевые слова SQL, прописными имена сущностей, созданных разработчиком, это не требование синтаксиса, а традиция, можно иметь свой стиль.
  • В скобках через запятую перечислены имена полей таблицы, и рядом через пробел их типы - это обязательное требование, а вот писать в столбик с отступами необязательно - можно в одну линию.
  • INTEGER тип поля: целое число.
  • VARCHAR тип поля: строка.
  • TEXT тип поля: многострочный текст (text - просто имя поля).
В отличии от Windows в Unix-подобных системах регистр букв в именованных сущностях (именах переменных, полях и пр. ) имеет значение: name, Name и NAME- это три разных переменных или поля.

Посмотрим что за структура получилась:

\d skazki

Результат работы команд мы здесь приводить в текстовом виде не будем, дзен их некрасиво форматирует. В необходимы случаях будут скришоты.


Запишем в таблицу несколько строф из сказки Пушкина:

insert into skazki (paragraph,name,autor,text)
values(1,'У лукоморья дуб зелёный','Пушкин',
'У лукоморья дуб зелёный;
Златая цепь на дубе том:
И днём и ночью кот учёный
Всё ходит по цепи кругом;');

insert into skazki (paragraph,name,autor,text)
values(2,'У лукоморья дуб зелёный','Пушкин',
'Идёт направо — песнь заводит,
Налево — сказку говорит.
Там чудеса: там леший бродит,
Русалка на ветвях сидит;');

insert into skazki (paragraph,name,autor,text)
values(3,'У лукоморья дуб зелёный','Пушкин',
'Там на неведомых дорожках
Следы невиданных зверей;
Избушка там на курьих ножках
Стоит без окон, без дверей;');

Здесь:
- insert, into, values - ключевые слова;
- paragraph,name,autor,text - имен полей таблицы skazki
- остальное пользовательский контент.

Посмотрим что и как у нас хранится в таблице.

select * from skazki;

Результат неутешительный - многократно повторяющиеся данные будут засорять базу, к тому же это потенциальный источник разнобоя и ошибок:
Пушкина можно называть одной фамилией, полностью или А.П. Пушкин, а кто-нибудь напишет просто - «Наше всё».

Вариант 2

В каждой таблице поле id будет уникальным идентификатором/индексом.

Создадим сразу 3 таблицы: для авторов, для названий произведений и для основного контента, т.е. для абзацев текста.

CREATE TABLE autors (
id SERIAL PRIMARY KEY,
date_birth TIMESTAMP,
date_death TIMESTAMP,fio varchar,
biography TEXT);

CREATE TABLE book (id SERIAL PRIMARY KEY, title varchar);

CREATE TABLE paragraph (id SERIAL PRIMARY KEY,
aid integer, tid integer, text TEXT);

insert into autors (fio) values('Пушкин Александр Сергеевич');
insert into book (title) values('У лукоморья дуб зелёный');

select * from autors;
select * from book;

insert into paragraph (aid, tid, text) values(1, 1,
'У лукоморья дуб зелёный;
Златая цепь на дубе том:
И днём и ночью кот учёный
Всё ходит по цепи кругом;');

insert into paragraph (aid, tid, text) values(1, 1,
'Идёт направо — песнь заводит,
Налево — сказку говорит.
Там чудеса: там леший бродит,
Русалка на ветвях сидит;');

insert into paragraph (aid, tid, text) values(1, 1,
'Там на неведомых дорожках
Следы невиданных зверей;
Избушка там на курьих ножках
Стоит без окон, без дверей;');

Посмотрим так:

select * from paragraph;

Потом вот так

select fio, title, text from paragraph, autors, book
where autors.id = aid and book.id = tid;

Лепота! Вид практически такой же как в первом варианте, но данные структурированы и разные сущности хранятся ровно по одному разу.

Можно углублять детализацию, например, добавить таблицу жанров/genre (сказки, романы, пьесы...), в таблице автора можно оставить только ФИО (причем Ф, И, О хранить в отдельных полях), а остальные сведения об авторе вынести в таблицу biography.

Но рано или поздно нужно будет остановиться. Остановимся сейчас.

Только удалим устаревшую таблицу сказок:

drop table skazki;