├── LICENSE ├── README.md ├── clickhouse ├── Readme.md ├── clickhouse.yaml ├── datasource.png └── worldmap.jpg ├── mongodb ├── README.md └── lab1 │ └── lab_1.md ├── postgres ├── img │ └── logo.png ├── lab1.md └── lab2.md └── redis ├── README.md ├── lab1 ├── alternatives.md ├── img │ ├── img-search.png │ └── vm-result.png └── lab_1.md └── lab2 └── lab_2.md /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Mihail Kuzmich 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Набір лабораторних робіт по базам даних 2 | Розрахована для студентів навчальних закладів України. 3 | Допомога у вигляді pull request або issue вітається. -------------------------------------------------------------------------------- /clickhouse/Readme.md: -------------------------------------------------------------------------------- 1 | ## Лабораторна робота 2 | ### Візуалізація даних із OLAP бази даних CLickhouse 3 | 4 | ### Інсталювати microk8s 5 | За посиланням нище встановити microk8s взалежності від вашої операційної системи виконашви необхідні команди. 6 | https://microk8s.io/ 7 | 8 | 9 | Інсталяцію можна перевірити наступною командою: 10 | ``` 11 | microk8s kubectl get pods -A 12 | ``` 13 | 14 | ### Налаштування microk8s 15 | Встановити базові компоненти microk8s, що необхідні для роботи. 16 | ``` 17 | microk8s enable metrics-server dns storage prometheus 18 | ``` 19 | * dns: розгортання CoreDNS. Цей компонент є обов'язковим для більшості, тому рекомендова, щоб він був завжди активований. 20 | * metrics-server: додає Kubernetes Metrics Server до API для доступу до сервісних метрик. 21 | * storage: створює клас сховища, що буде використовувати дисковий простір локальної машини. 22 | * prometheus: розгортання Prometheus Operator-а. 23 | 24 | Через 5 хв перевірити їх готовність: 25 | ``` 26 | ✗ microk8s kubectl get pods -A 27 | NAMESPACE NAME READY STATUS RESTARTS AGE 28 | kube-system kubernetes-dashboard-869949b85-7vjgd 1/1 Running 6 (6m22s ago) 2d2h 29 | observability prometheus-operator-7775c66ccf-nbj59 2/2 Running 12 (6m22s ago) 7d3h 30 | observability node-exporter-dnjct 2/2 Running 12 (6m22s ago) 7d3h 31 | observability prometheus-adapter-59df95d9f5-52chj 1/1 Running 6 (6m22s ago) 7d3h 32 | observability kube-state-metrics-76f6cb7996-qd4xg 3/3 Running 18 (6m22s ago) 7d3h 33 | observability blackbox-exporter-55c457d5fb-xkjxz 3/3 Running 18 (6m22s ago) 7d3h 34 | kube-system dashboard-metrics-scraper-58d4977855-4p9qz 1/1 Running 6 (6m22s ago) 2d2h 35 | observability prometheus-adapter-59df95d9f5-xzk5g 1/1 Running 6 (6m22s ago) 7d3h 36 | kube-system metrics-server-85df567dd8-q5lbc 1/1 Running 6 (6m22s ago) 2d2h 37 | ****** 38 | ``` 39 | Cтатус  "Running" означає, що компонент готовий. 40 | 41 | ### Налаштування grafana-и 42 | Прокинути сервіс графани на локальну машину: 43 | ``` 44 | microk8s kubectl port-forward svc/kube-prom-stack-grafana 3000:80 -n observability 45 | ``` 46 | 47 | Grafana буде доступна за посиланням http://localhost:3000/ . 48 | Дефолтний пароль: 49 | ``` 50 | login: admin 51 | password: prom-operator 52 | ``` 53 | Ознайомитись із UI. 54 | Завдання: 55 | Додати себе(Ваше прізвище та ім'я) як нового користувача. 56 | 57 | 58 | #### Вставнолення clickhose data source плагіну: 59 | 60 | Data source плагіни відповідають за комунікацію між сторонніми ресурсами і повертають дані в форматі, який буде зрозумілий grafana-і. 61 | Додаючи data source plugin, ви можете використовувати дані в будь якій дашборді. 62 | 63 | Встановити plugin можна як із допомогою grafana-cli так із допомогою UI. 64 | ``` 65 | microk8s kubectl get pods -A # для того аби отримати список всіх подів, що запущені в кластері 66 | microk8s kubectl exec -it -n observability -c grafana -- /bin/bash 67 | grafana-cli plugins install grafana-clickhouse-datasource 68 | ``` 69 | Після запуску команди наявність плагіну слід перевірити в UI http://localhost:3000/ . 70 | 71 | https://grafana.com/grafana/plugins/grafana-clickhouse-datasource/?tab=installation 72 | 73 | ### Інсталяція clickhouse. 74 | https://docs.altinity.com/clickhouseonkubernetes/kubernetesquickstartguide/quickstartinstallation/ 75 | 76 | 77 | ``` 78 | microk8s kubectl apply -f https://github.com/Altinity/clickhouse-operator/raw/0.18.3/deploy/operator/clickhouse-operator-install-bundle.yaml 79 | microk8s kubectl create namespace test 80 | 81 | microk8s kubectl apply -f https://raw.githubusercontent.com/kuzm1ch/database_labs/feat/clickhouse/clickhouse/clickhouse.yaml 82 | microk8s kubectl get all -n test # перевірка 83 | ``` 84 | Дефолтний логін та пароль 85 | ``` 86 | Default Username: clickhouse_operator 87 | Default Password: clickhouse_operator_password 88 | ``` 89 | 90 | ### Завантажння даних (dataset) 91 | 92 | https://clickhouse.com/docs/en/getting-started/example-datasets/opensky 93 | 94 | ``` 95 | microk8s kubectl -n test exec -it chi-demo-01-demo-01-0-0-0 -- /bin/bash 96 | ``` 97 | 98 | https://docs.altinity.com/integrations/clickhouse-and-grafana/grafana-create-charts/ - те чого треба досягти, а саме візалізувати дані для потреб моніторингу(у випадку, якщо б дані в БД поступали постійно) та аналітики 99 | 100 | ``` 101 | kubectl -n test exec -it chi-demo-01-demo-01-0-0-0 -- clickhouse-client 102 | SELECT formatReadableSize(total_bytes) FROM system.tables WHERE name = 'opensky'; 103 | ``` 104 | 105 | ### Підключення grafana 106 | 107 | 108 | -------------------------------------------------------------------------------- /clickhouse/clickhouse.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | apiVersion: "clickhouse.altinity.com/v1" 3 | kind: "ClickHouseInstallation" 4 | metadata: 5 | name: "demo-01" 6 | namespace: test 7 | spec: 8 | configuration: 9 | clusters: 10 | - name: "demo-01" 11 | layout: 12 | shardsCount: 1 13 | replicasCount: 1 14 | templates: 15 | podTemplate: clickhouse-stable 16 | volumeClaimTemplate: storage-vc-template 17 | templates: 18 | volumeClaimTemplates: 19 | - name: storage-vc-template 20 | spec: 21 | storageClassName: microk8s-hostpath 22 | accessModes: 23 | - ReadWriteOnce 24 | resources: 25 | requests: 26 | storage: 5Gi 27 | -------------------------------------------------------------------------------- /clickhouse/datasource.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuzm1ch/database_labs/5baef8947c0231b45da007ef1eac7c632446950e/clickhouse/datasource.png -------------------------------------------------------------------------------- /clickhouse/worldmap.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuzm1ch/database_labs/5baef8947c0231b45da007ef1eac7c632446950e/clickhouse/worldmap.jpg -------------------------------------------------------------------------------- /mongodb/README.md: -------------------------------------------------------------------------------- 1 | ## Набір лабораторних робіт по MongoDB 2 | Дана лабораторна роботи написанні на основі [The Little MongoDB Book](https://github.com/night-codes/The-Little-MongoDB-Book-rus). Розраховона для студентів навчальних закладів України. 3 | Допомога у вигляді pull request або issue вітається. 4 | ### 1 Лабораторна 5 | https://docs.google.com/document/d/14OiLjJzycO7ZTSlABW4Sqvx1I7xIVc5ablQXNgHvw0U/edit?usp=sharing 6 | #### TODO 7 | * ~перенести весь контент із гугл доку в гіт~ 8 | * розширити лабораторну інформацією із [The Little MongoDB Book](https://github.com/night-codes/The-Little-MongoDB-Book-rus), переклавши її українською 9 | * розширити лабораторну картинками та скрінами(тобто по можливості зробити її більш живою) - optional 10 | -------------------------------------------------------------------------------- /mongodb/lab1/lab_1.md: -------------------------------------------------------------------------------- 1 | ## Лабораторна робота №1 2 | ### Знайомство із MongoDB 3 | 4 | #### Мета: знайомство зі сховищем даних MongoDB, області використання та базових операції в командній строці з допомогою mongo(cli). Огляд основних складових: колекції, документи, поля, індекси, курсори. 5 | 6 | 7 | Перед початком лабораторної роботи слід опрацювати/завантажити книгу [“The Little MongoDB Book“, Karl Seguin](https://www.pvsm.ru/download/mongodb-ru.pdf). В ній є буде необхідна інформації, яка допоможе при виконанні лабораторної роботи. 8 | 9 | ### Вступ 10 | MongoDB — документо-орієнтована система керування базами даних (СКБД) з відкритим вихідним кодом, яка не потребує опису схеми таблиць. MongoDB займає нішу між швидкими і масштабованими системами, що оперують даними у форматі ключ/значення, і реляційними СКБД, функціональними і зручними у формуванні запитів. Код MongoDB написаний на мові C++ і поширюється в рамках ліцензії AGPLv3. 11 | MongoDB підтримує зберігання документів в JSON-подібному форматі, має досить гнучку мову для формування запитів, може створювати індекси для різних збережених атрибутів, ефективно забезпечує зберігання великих бінарних об'єктів, підтримує журналювання операцій зі зміни і додавання даних в БД. 12 | 13 | Для початку потрібно зрозуміти шість основних концепцій. 14 | 1. MongoDB - концептуально те ж саме, що звичайна, звична нам база даних (або в термінології Oracle - схема). 15 | 2. Усередині MongoDB може бути нуль або більше баз даних, кожна з яких є контейнером для інших сутностей. 16 | 3. База даних може мати нуль або більше «колекцій». Колекція настільки схожа на традиційну «таблицю», що можна сміливо вважати їх одним і тим же. 17 | 4. Колекції складаються з нуля або більше «документів». Знову ж, документ можна розглядати як «рядок». 18 | Документ складається з одного або більше «полів», які - як можна здогадатися - подібні «колонкам». 19 | 5. «Індекси» в MongoDB майже ідентичні таким в реляційних базах даних. 20 | 6. «Курсор» відрізняються від попередніх п'яти концепцій, але вони дуже важливі (хоча часом їх обходять увагою) і заслуговують окремого обговорення. Важливо розуміти, що коли ми запитуємо у MongoDB будь-які дані, то вона повертає курсор, з якими ми можемо робити все що завгодно - підраховувати, пропускати певну кількість попередніх записів - при цьому не завантажуючи самі дані. 21 | 22 | 23 | ### Хід Роботи 24 | 25 | #### 1. Встановлення 26 | 27 | ##### Windows: 28 | https://metanit.com/nosql/mongodb/1.2.php (простий мануал) 29 | https://docs.mongodb.com/manual/tutorial/install-mongodb-on-windows/ (офіційна документація) 30 | 31 | ##### Linux: 32 | Використовуючи пакетний менеджер вашої системи: 33 | https://docs.mongodb.com/manual/administration/install-on-linux/ (офіційна документація) 34 | 35 | ##### Docker(незалежно від OS): 36 | docker run -p 27017:27107 mongo:latest (запустити mongoDB server) 37 | doker exec -it mongo (підключитись до MongoDB серверу з допомогою cli mongo) 38 | 39 | #### 2. Ознайомлення із базовими командами. 40 | 41 | Запустіть сервер mongod і консоль mongo, якщо ще не запустили. Консоль працює на JavaScript. Є кілька глобальних команд, наприклад help або exit. Команди, які ви запускаєте стосовно поточної бази даних виконуються у об'єкта db, наприклад `db.help()` або `db.stats()`. Команди, які ви запускаєте стосовно конкретної колекції, виконуються у об'єкта db.ІМЯ_КОЛЛЕКЦІІ, наприклад `db.unicorns.help()` або `db.unicorns.count()`. 42 | 43 | `db.help()` - список команд, які можна виконати в об'єкта 44 | 45 | Спершу для вибору бази даних скористаємося глобальним методом use - введіть `use learn`. Неважливо, що база даних поки що не існує. У момент створення першої колекції створюється база даних learn. Тепер, коли ви всередині бази даних, можна 46 | викликати у неї команди, наприклад `db.getCollectionNames()`. У відповідь побачите порожній масив ([]). Оскільки колекції безструктурні (в оригіналі `` schema-less ''. Тут і далі - прим. перекл.), ми не зобов'язані створювати їх явно. Ми просто можемо вставити документ в нову колекцію. Щоб це зробити, використовуйте команду insert, передавши 47 | їй вставляється документ: 48 | 49 | `db.unicorns.insert({name: 'Aurora', gender: 'f', weight: 450})` 50 | 51 | Цей рядок виконує метод insert («вставити») в колекцію unicorns, передаючи йому єдиний аргумент. MongoDB у себе всередині використовує бінарний серіалізований JSON формат. Зовні це означає, що ми широко використовуємо JSON, як, наприклад, у випадку з нашими параметрами. 52 | 53 | Вивести список всіх колекцій в базі даних learn: 54 | `db.getCollectionNames()` 55 | 56 | Повернути список документів в колекції unicorns: 57 | `db.unicorns.find()` 58 | 59 | Видалити колекцію unicorns: 60 | `db.unicorns.remove()` 61 | 62 | #### Завдання 1: 63 | 64 | 1. Створити колекцію студенти(від 5 студентів) із такими полями: 65 | 66 | ``` 67 | db.students.insert({name: 'Anna', dob: new Date(1992,2,13,7,47), loves: ['football','databases'], weight: 140, gender: 'female', course: 2, avg_mark: 77}); 68 | ``` 69 | 70 | * Кожний документ повинен мати хоча б одне унікальне поле (наприклад поле alergia: apple буде тільки в одного студента 71 | * Один із студентів повинен мати ваше Прізвище та містити поле із номером в групі. 72 | 73 | #### Завдання 2: 74 | Тепер, коли дані створені, можна приступати до освоєння селекторів. {Поле: значення} використовується для пошуку всіх документів, у яких поле дорівнює значення. {Поле1: значення1, поле2: значення2} працює як логічне І. Спеціальні оператори $ lt, $ lte, $ gt, $ gte і $ ne використовуються для вираження операцій «менше», «менше або дорівнює», «більше», «більше або дорівнює », і« не дорівнює ». Наприклад, щоб отримати всіх студентів, що важать більше або рівно 140 фунтів, ми можемо написати: 75 | 76 | `db.students.find({weight: {$gte: 140}})` 77 | 78 | 1. Написати селектор, який виведе список студентів 2-го курсу, які люблять футбол. 79 | 2. Написати селектор, який виведе список студентів жіночої статі, які люблять або футбол або бази даних або середня оцінка вище (2 * Ваш номер в групі). 80 | 3. Вивести к-сть студентів в групі 3-го курсу (db.students.count) 81 | 4. Видалити студентів, в який існує поле алергія($exists). 82 | 83 | Поміж операторів, які були використані, існує гнучкий оператор - $where, що дозволяє нам передавати JavaScript для його виконання на сервері. Це описано в розділі Складні запити на [сайті MongoDB](https://docs.mongodb.com/manual/reference/operator/query/where/). 84 | Отже, було розглянуто основи, які нам потрібні для початку роботи. Це також те, що ви можливо будете використовувати більшу частину часу. 85 | 86 | ##### Вимоги до оформлення 87 | Звіт лабораторної роботи повинен містити текстову частину завдання і скріншоти із командами та відповідним виводом. В кінці звіту обов'язково повинен бути висновок. 88 | -------------------------------------------------------------------------------- /postgres/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuzm1ch/database_labs/5baef8947c0231b45da007ef1eac7c632446950e/postgres/img/logo.png -------------------------------------------------------------------------------- /postgres/lab1.md: -------------------------------------------------------------------------------- 1 | ## Лабораторна робота №1 2 | ### Знайомство із PostgreSQL 3 | 4 | 5 | #### Мета: знайомство із СУБД PostgreSQL, її області використання, способи інсталювання та керування. 6 | Лабораторна робота побудована із використанням відкритого ресурсу www.postgresqltutorial.com . 7 | 8 | #### Що таке PostgreSQL 9 | * PostgreSQL — це реляційна СУБД з відкритою кодовою базою. PostgreSQL підтримує як SQL (реляційні), так і JSON (нереляційні) запити. 10 | * PostgreSQL — це високостабільна база даних, що підтримується та активно розроблюється open-source спільнотою більш ніж 20 років. 11 | * PostgreSQL використовується як основна база даних для багатьох веб, мобільних і аналітичних додатків. 12 | * PostgreSQL-спільнота вимовляє PostgreSQL як /ˈpoʊstɡrɛs ˌkjuː ˈɛl/. 13 | 14 | #### Історія PostgreSQL 15 | Проект PostgreSQL розпочався в 1986 році на факультеті комп’ютерних наук Берклі Каліфорнійського університету. Початкова назва була POSTGRES, посилаючись на стару базу даних Ingres, яку також була розроблено в Берклі. Метою POSTGRES було додати функції, що необхідні для підтримки різних типів даних. У 1996 році проект POSTGRES був перейменований на PostgreSQL, щоб чітко проілюструвати його підтримку SQL. Сьогодні PostgreSQL зазвичай скорочується як Postgres. Із 1996 Група глобальної розробки PostgreSQL(PostgreSQL Global Development Group), спеціальна спільнота учасників, продовжує випускати безплатні версії бази даних із відкритим кодом. Спочатку PostgreSQL був розроблений для роботи тільки на UNIX-подібних платформах, пізніше були доопрацювання, що дозволили її запускати на Windows, macOS і Solaris. 16 | 17 | #### Області використання СУБД PostgreSQL 18 | Області використання PostgreSQL дуже широкі, нижче наведені деякі приклади. 19 | 1. Надійна база даних у стеку LAPP. 20 | LAPP означає Linux, Apache, PostgreSQL і PHP (або Python і Perl). PostgreSQL виконує ф-ції надійного внутрішнього сховища даних, яку використовують багато динамічних веб-сайтів і веб-додатків. 21 | 2. Транзакційна база даних загального призначення. 22 | Великі корпорації та стартапи використовують PostgreSQL як основну базу даних для підтримки своїх програм і продуктів. 23 | 3. Геопросторова база даних. 24 | PostgreSQL з розширенням PostGIS підтримує геопросторові дані для геоінформаційних систем (GIS). 25 | 26 | ### 🎯 Завдання 27 | На сайті https://www.postgresqltutorial.com/ пройти курс [getting started](https://www.postgresqltutorial.com/postgresql-getting-started) та оформити прогрес у вигляді звіту. 28 | [Getting started курс](https://www.postgresqltutorial.com/postgresql-getting-started) включає в себе такі основні пункти: 29 | - Інсталювання 30 | - Встановлення з'єднання з допомогою інтерфейса командого рядку(CLI) psql та веб-застосунку pgAdmin. 31 | - Завантаження тестової бази даних DVD Rental(psql/pgAdmin). 32 | 33 | Зверніть уваги, що інсталювати потрібно для однієї опреаційної системи на ваш вибір(Unix/Windows/MacOS), не потрібно це робити одночасно для всіх. З'єднання повинно бути встановлена із допомогою psql та pgAdmin. Завантаження тестової бази потрібно робити в такому порядку: 34 | 1. завантажити дамп бази DVD Rental з допомогою psql 35 | 2. командами postgres(`\dt`) показати, що база було завантажено 36 | 3. видалити DVD Rental(`DROP dvdrental`) 37 | 4. завантажити дамп бази DVD Rental з допомогою pgAdmin 38 | 5. показати на скріні(pgAdmin), що базу було успішно завантажено 39 | 6. створіть в даній базі(dvdrental) нову таблицю із назвою, що дорівнює вашому прізвищу, та колонками id, date, name. 40 | 41 | Ivanov_table 42 | | id | name | date | 43 | |----|------|------| 44 | | - | - | - | 45 | | - | - | - | 46 | 47 | ##### Вимоги до оформлення 48 | Звіт лабораторної роботи повинен містити текстову частину завдання і скріншоти із командами та відповідним виводом. В кінці звіту обов'язково повинен бути висновок. 49 | -------------------------------------------------------------------------------- /postgres/lab2.md: -------------------------------------------------------------------------------- 1 | ## Лабораторна робота №2 2 | ### PostgreSQL. Встановлення з'єднання використовуючи Python. 3 | 4 | 5 | #### Мета: знайомство з принципом встановлення з'єднання до бази даних з використанням мови програмування Python 6 | Лабораторна робота побудована з використанням відкритого ресурсу www.postgresqltutorial.com 7 | 8 | #### Мова програмування Python (короткі відомості) 9 | * Python – динамічна інтерпретована об’єктно-орієнтована скриптова мова програмування з суворою динамічною типізацією. Розроблена в 1990 році голландським програмістом Гвідо ван Россумом. 10 | * Автор назвав мову на честь популярного британського комедійного серіалу 1970-х років "Летючий цирк Монті Пайтона». Найуживаніша вимова назви — «Па́йтон». 11 | * Офіційний сайт мови програмування Python https://www.python.org/ 12 | * Python – багатоцільова мова програмування, яка дозволяє писати код, що добре читається. Відносний лаконізм мови Python дозволяє створити програму, яка буде набагато коротше свого аналога написаного на іншій мові. 13 | * Python - мультиплатформна мова програмування. Це означає, що програми на Python можна запускати в різних операційних системах без будь-яких змін. 14 | * Ще однією перевагою Python є його стандартна бібліотека, яка встановлюється разом з Python і містить готові інструменти для роботи з операційною системою, веб-сторінками, базами даних, різними форматами даних, для побудови графічного інтерфейсу програм тощо. 15 | * Програми, написані на мові програмування Python, можуть бути як невеликими скриптами, так і складними системами. 16 | * Python безкоштовний у використанні та із відкритим кодом(Open source) https://github.com/python 17 | 18 | 19 | #### psycopg адаптер 20 | * В даній роботі з'єднання буде встановлено з використанням psycopg python адаптеру. Psycopg є найбільш популярним адаптером для PostgreSQL на Python. Його основні переваги — це повна реалізація специфікації Python DB API 2.0 і безпека потоків (кілька потоків можуть використовувати одне з'єднання). Він був розроблений для багатопоточних програм, які створюють і знищують велику кількість курсорів і створюють велику кількість одночасних «INSERT» або «UPDATE». 21 | 22 | * Psycopg 2 здебільшого реалізовано на мові програмування C як обгортка до [libpq](https://www.postgresql.org/docs/9.5/libpq.html), що робить його однозначно ефективним та безпечним. Також адаптер дозволяє використовувати курсори як на стороні клієнта так і на стороні сервера, підтримує асинхронність в сповіщенні та комунікації, та «COPY TO/COPY FROM»(«КОПІЮВАТИ В/КОПІЮВАТИ З»). Багато типів даних Python підтримуються відразу після встановлення і адаптуються до типів даних PostgreSQL; адаптація може бути розширена та налаштована завдяки гнучкій системі адаптації об'єктів. Psycopg 2 може взаємодіяти з Unicode і Python 3. 23 | 24 | * Встановлення psycopg слід виконати за допомогою пакетного менеджера мови Python - pip, який буде автоматично встановлений якщо Python був завантажений із python.org . В протилежному випадку можна скористатись [документацією](https://pip.pypa.io/en/stable/installation/). 25 | 26 | ### 🎯 Завдання 27 | На сайті https://www.postgresqltutorial.com/ пройти курс [PostgreSQL Python: Connect To PostgreSQL Database Server](https://www.postgresqltutorial.com/postgresql-python/connect/) та оформити прогрес у вигляді звіту. 28 | [PostgreSQL Python: Connect To PostgreSQL Database Server](https://www.postgresqltutorial.com/postgresql-python/connect/) містить такі основні пункти: 29 | - встановлення psycopg2 адaптеру для спілкування з БД; 30 | - під'єднатись до БД з використанням python скрипта `connect.py`. Параметри з'єднання винесені у файл `database.ini`. 31 | 32 | Окрім завдань описаних у курсі слід виконати і наступне: 33 | 1. створити базу даних із назвою "NameSurname", яка відповідає вашому імені та прізвищу, наприклад "IvanIvanov", і саме до неї встановлювати з'єднання (параметр `database` в `database.ini`); 34 | 2. окрім версії СУБД ваш скрипт повинен виводити назву поточної бази даних (наприклад `IvanIvanov`). 35 | 36 | ##### Вимоги до оформлення 37 | Звіт лабораторної роботи повинен містити текстову частину завдання та скріншоти з командами та відповідним виводом. В кінці звіту обов'язково повинен бути висновок. 38 | -------------------------------------------------------------------------------- /redis/README.md: -------------------------------------------------------------------------------- 1 | ## Набір лабораторних робіт по Redis 2 | Дані лабораторні роботи написанні на основі [The Little Redis Book](https://github.com/karlseguin/the-little-redis-book). Розраховона для студентів навчальних закладів України. 3 | Допомога у вигляді pull request або issue вітається. 4 | ### 1 Лабораторна 5 | https://docs.google.com/document/d/19fZ01svlQgH2Eq7IhMx5t8qaCFh-uvBQuMIV_Seam8Y/edit?usp=sharing 6 | #### ~~TODO~~ 7 | * ~~перенести весь контент із гугл доку в гіт~~ 8 | * ~~розширити лабораторну картинками та скрінами(тобто по можливості зробити її більш живою) - optional~~ 9 | * ~~перенести необхідну інформацію із [The Little Redis Book](https://github.com/karlseguin/the-little-redis-book), переклавши її українською~~ 10 | 11 | ### 2 Лабораторна 12 | https://docs.google.com/document/d/19iWQrd3ZkGha9bx_7oX4VdZAQPAYl4QrwdJPUQ5J-_s/edit?usp=sharing 13 | #### TODO 14 | * ~~перенести весь контент із гугл доку в гіт~~ 15 | * перенести необхідну інформацію із [The Little Redis Book](https://github.com/karlseguin/the-little-redis-book), переклавши її українською, щоб вся необхідна інформація по роботі була в одному місці 16 | -------------------------------------------------------------------------------- /redis/lab1/alternatives.md: -------------------------------------------------------------------------------- 1 | 2 | ### Встановлення Linux на VM(virtual machine) 3 | 4 | Переклад статті https://www.instructables.com/How-to-install-Linux-on-your-Windows/ 5 | 6 | Для установки вам необхідні дві речі: 7 | 8 | - VirtualBox 9 | Програму можна запускати як на Windows, так і на Linux & Mac. 10 | 11 | Ви її можете завантажити по [посиланню](https://www.virtualbox.org/wiki/Downloads) 12 | 13 | 14 | #### Крок 1 Виберіть тип системи 15 | 16 | ![virtual box](https://cdn.instructables.com/ORIG/FM6/J57Z/HLJV1WNK/FM6J57ZHLJV1WNK.png?auto=webp&frame=1&fit=bounds&md=219b622b5eaafe931cf6097957e174ed 17 | "Title") 18 | 19 | -Після установки Virtual Box, натисніть Додати -> шлях до образу дистрибутива (Linux Mint 15 ) 20 | -Напишіть назву вашої системи, наприклад Linux Mint 15 21 | 22 | 23 | #### Крок 2 Виберіть кількість оперативної пам'яті для використання 24 | 25 | 26 | 27 | ![virtual box](https://cdn.instructables.com/ORIG/FX1/NW30/HLJV1WOP/FX1NW30HLJV1WOP.png?auto=webp&frame=1&fit=bounds&md=01789b9bd61617546f67a533c8b32015 28 | "Title") 29 | 30 | Наприклад: 31 | 32 | ```1024 MB = 1 GB``` 33 | 34 | 35 | #### Крок 3 Налаштування накопичувача (жорсткого диску/ssd ) 36 | 37 | - Оберіть створити новий віртуальний диск 38 | - Оберіть VDI щоб зробити бекап 39 | - Оберіть динамічний жорсткий диск 40 | - Оберіть об'єм пам'яті та ім'я для диску (Для установки дистрибутиву необхідно мінімум 12гб ) 41 | 42 | 43 | #### Крок 4 Оберіть ISO-файл для дистрибутиву 44 | - Натисніть кнопку Запустити 45 | Після завантежння образу завантажувальної флешки, ви маєте бачити наступний результат 46 | ![virtual distro](img/vm-result.png) 47 | 48 | #### Крок 5 Установка Linux 49 | 50 | - Натисніть на 'Встановити Linux Mint` 51 | - Оберіть мову для установки по бажанню(у прикладі використовується українська) 52 | - Оберіть форматувати диск та встановити Linux Mint 53 | - Натисніть встановити зараз 54 | - Створіть аккаунт 55 | - Натисніть продовжити і очікуйте кінця установки 56 | - Done! 57 | 58 | 59 | #### Крок 6 Вітання 60 | 61 | Тепер ви маєте віртуальну машину для Linux на Windows 62 | -------------------------------------------------------------------------------- /redis/lab1/img/img-search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuzm1ch/database_labs/5baef8947c0231b45da007ef1eac7c632446950e/redis/lab1/img/img-search.png -------------------------------------------------------------------------------- /redis/lab1/img/vm-result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuzm1ch/database_labs/5baef8947c0231b45da007ef1eac7c632446950e/redis/lab1/img/vm-result.png -------------------------------------------------------------------------------- /redis/lab1/lab_1.md: -------------------------------------------------------------------------------- 1 | ## Лабораторна робота №1 2 | ### Знайомство з Redis 3 | 4 | #### Мета: знайомство з розподіленим сховищем Redis, його інсталювання, області використання та базові операції в командному рядку за допомогою redis-cli. Знайомство з типами даних: такі як рядки та хеши (словники). 5 | 6 | В загальному Redis це сховище типу ключ значення, яке тримає дані в оперативній пам’яті та зберігає їх на диск для забезпечення надійності. 7 | 8 | 9 | Перед початком роботи потрібно опрацювати книжку [“The Little Redis Book”](https://github.com/akandratovich/the-little-redis-book/tree/master/ru 10 | ) Karl Seguin, в якій присутня додаткова інформація для виконання лабораторної роботи. Вона також має приклади виконання завдань лабораторної. 11 | 12 | ### Хід Роботи 13 | 14 | #### 1. Встановллення 15 | 16 | Для користувачів Windows 10 необхідно активувати WSL2 (Windows Subsystem for Linux - рівень сумісності, що дозволяє нативно запускати бінарні файли Linux). 17 | 18 | 19 | 20 | #### 1.1 Налаштування WSL 21 | 22 | Відкрийте PowerShell від імені адміністратора та виконайте наступну команду, щоб можна було використовувати WSL 23 | 24 | ```Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux``` 25 | 26 | Після виконання команди перезавантажте комп'ютер. Далі, потрібно перевірити чи ввімкнута функція віртуалізації у вашій системі. 27 | Для цього необхідно зайти в диспетчер задач перейти по вкладці продуктивність(производительность - рус.) 28 | В нижній частині вікна, ви маєте побачити наступний напис 29 | 30 | ```Виртуализация: включено``` 31 | 32 | 33 | ##### 1.1.1 Апаратна віртуалізація 34 | 35 | У випадку, коли віртуалізація у вас вимкнена на рівні BIOS. Аби це вирішити, зайдіть в налаштування BIOS, а саме - CPU Configuration. 36 | Знайдіть наступну опцію 37 | Для процесорів Intel: ``` Intel Virtualization Technology ``` 38 | 39 | Для процесорів AMD: ```SVM Mode ``` 40 | 41 | 42 | 43 | #### 1.2 Встановлення Linux-дистрибутива 44 | 45 | Для встановлення дистрибутиву скористуємось Microsoft Store. В панелі пошуку обираємо Ubuntu 20.04 LTS. 46 | Встановлюємо пакет і запускаємо як окремий додаток, знайшовши його в панелі пошуку. 47 | 48 | 49 | 50 | Для перевірки роботи WSL, запускаємо дистрибутив. Якщо при встановленні не виникло ніяких проблем, то після задання імені користувача та його паролю, система готова до використання! 51 | 52 | ##### Альтернативи 53 | 54 | Альтернативою WSL може бути віртуальна машина Linux або використання Docker. 55 | 56 | [Встановлення docker на Windows (англ)](https://docs.docker.com/docker-for-windows/install/) 57 | [Встановлення Linux на Virtual Box](alternatives.md) 58 | 59 | #### 1.3 Встановлення redis на дистрибутив Ubuntu 60 | 61 | Запустіть linux-дистрибутив та встановіть redis виконавши наступні команди (OS Ubuntu): 62 | 63 | ```console 64 | sudo apt-get update 65 | sudo apt-get upgrade 66 | sudo apt-get install redis-server 67 | redis-cli -v 68 | ``` 69 | 70 | #### 2. Перевірка роботи redis за допомогою redis-cli та команди ping 71 | 72 | 73 | 74 | Запустіть термінал Redis командою `redis-cli`. Таким чином, створиться підключення до локального серверу на 6379 TCP-порту за замовчуванням. 75 | 76 | Ви можете переконатись, що все працює, виконавши команду `info` в командному рядку. Ви маєте побачити таблицю ключ-значеня, яка показує всю інформацію про стан серверу. 77 | 78 | 79 | 80 | Якщо у вас виникли проблеми при виконанні описаних вище дій, спробуйте запустити redis сервер ще раз, ввівши команду `redis-server`, в іншому випадку рекомендуємо шукати допомоги на [офіційному форумі підтримки Redis](https://groups.google.com/forum/#!forum/redis-db). 81 | 82 | ``` 83 | $ redis-cli 84 | 127.0.0.1:6379> ping "Hello world from Imia Familia" 85 | "Hello world from Imia Familia" 86 | ``` 87 | 88 | ##### Завдання №1 89 | - Вивести командою ping вашe прізвище та ім'я, як показано вище. 90 | 91 | 92 | #### 3. Робота зі запитами set | get. 93 | 94 | ##### Ключі та значення 95 | 96 | Не дивлячись на те, що Redis більше, ніж просто сховище типу ключ-значення, в його основі кожна з п'яти використовуючих структур даних має, як мінімум, ключ і значення. Дуже важливо розібратися в тому, що таке ключ і що таке значення, перед тим як рухатись далі. 97 | Ключ - це те, чим ми маркуємо частини інформації (ідентифікатори). Ми будемо користуватися ключами часто, але поки досить знати, що ключ може виглядати так 98 | `users:leto` 99 | 100 | Під таким ключем можна очікувати інформацію про користувача під іменем `leto`. Двокрапка не має ніякого особливого значення, але використання подібних розділювачів є гарним тоном написання. 101 | 102 | 103 | 104 | 105 | Значення - це дані, які асоційовані з ключем. Це може бути що завгодно. Іноді це рядки, іноді числа, а іноді там зберігаються серіалізовані об'єкти (у вигляді JSON, XML або будь-яких інших форматів). В основному, Redis розглядає значення як масив байт і не цікавиться тим, що вони собою представляють. Зверніть увагу, що різні драйвера виконують серіалізацію по різному. Тому, тут ми будемо говорити тільки про рядки (string), цілі числа (integer) та JSON. 106 | 107 | Давайте попрактикуємось. Виконайте наступні команди: 108 | 109 | set users:leto "{name: leto, planet: dune, likes: [spice]}" 110 | 111 | 112 | 113 | Майже всі команди Redis виглядають подібним чином. Спочатку йде сама команда, в нашому випадку `set`, а потім параметри. Команда `set` приймає два параметри: ключ який ми зберігаємо, і значення, яке пов'язане з ним. Багато, але не всі, команди приймають аргументом ключ (це зазвичай перший параметр). А тепер вгадайте, як отримати це значення? Сподіваюся, що ви здогадалися (не турбуйтеся, якщо це не так): 114 | 115 | get users:leto 116 | 117 | 118 | ##### Завдання №2 119 | - Створити ключ, який повинен містити в собі ваше ім’я students:yourname , групу та номер в групі, після вивести його значення. Приклад створення ключа: 120 | ```console 121 | set students:yourname "{name: your_name, university: dut, group: PD-32, id: number_in_group ]}" 122 | ``` 123 | 124 | 125 | #### 4. Знайомство з типами даних redis. 126 | 127 | Типи даних: рядки, списки, множини, хеш таблиці, впорядковані множини. 128 | 129 | ##### 4.1 Рядки 130 | 131 | Рядки найпростіша структура даних у Redis. Коли ви думаєте про пару ключ-значення, ви думаєте про рядки. Маючи унікальні імена (ключі), значення рядків можуть буди будь-якими. 132 | 135 | Ми вже бачили типовий приклад використання рядків: зберігання об'єктів з відповідними ключами. Це саме те, з чим вам доведеться працювати найчастіше: 136 | 137 | set users:leto "{name: leto, planet: dune, likes: [spice]}" 138 | 140 | Додатково, Redis дозволяє виконувати деякі стандартні дії з рядками. Наприклад, `strlen <ключ>` використовується для обчислення довжини значення, пов'язаного з ключем; `Getrange <ключ> <початок> <кінець>` повертає підрядок з рядка; `Append <ключ> <значення>` додає введене значення до кінця існуючої рядка (або створює нове значення, якщо зазначений ключ не визначений). Спробуйте ці команди в дії. 141 | 142 | strlen users:leto 143 | (integer) 42 144 | 145 | getrange users:leto 27 40 146 | "likes: [spice]" 147 | 148 | append users:leto " OVER 9000!!" 149 | (integer) 54 150 | 151 | ##### Завдання №3 152 | - Знайти довжину значення ключа students:yourname. 153 | - Вивести підрядок починаючи з порядкового номеру вас у списку групи та закінчуючи 40 зі значення ключа ```students:yourname```. 154 | - Додати до цього ж значення рядок ``` “ extra !data!”``` та вивести кінцеве значення. 155 | 156 | ##### 4.2 Хеш 157 | Хеш - гарний приклад того, чому Redis не просто сховище ключ-значення. Хеш багато в чому схожий на рядок. Важливе те, що вони додають окремий рівень адресації даних - поля (fields). Еквівалентом команди set i get є hset та hget. Приклад: 158 | 159 | ``` 160 | hset users:goku powerlevel 9000 161 | hget users:goku powerlevel 162 | ``` 163 | За допомогою хешів ми можемо отримувати відразу декілька полей, всі поля зі значеннями та видаляти окремі поля. Хеші дають трішки більше контролю, а ніж рядки. 164 | ``` 165 | hmset users:goku race saiyan age 737 166 | hmget users:goku race powerlevel 167 | hgetall users:goku 168 | hkeys users:goku 169 | hdel users:goku age 170 | ``` 171 | 174 | 175 | Замість того, щоб зберігати дані про користувача у вигляді одного серіалізованого значення, ми можемо використовувати хеш для більш точного уявлення. Перевагою буде можливість вилучення, зміни та видалення окремих частин даних без необхідності читати і записувати все значення повністю. 176 | 177 | Розглядаючи хеш як структуровані об'єкти, такі як дані користувача, важливо розуміти, як вони працюють. Такий підхід може бути корисний для збільшення продуктивності, проте хеш може використовуватися для організації даних і зручності запитів до них, саме для цього вони особливо корисні. 178 | 179 | ##### Завдання №4: 180 | 181 | - Створити хеш таблицю students:hash_yourname з полями name: your_name, university: sut, group: PD-32, id: number_in_group 182 | - Добавити поле age з відповідним значенням 183 | - Вивести всі значення 184 | - Вивести значення поля id 185 | - Видалити поле university 186 | 187 | 188 | ##### Вимоги до оформлення 189 | Звіт лабораторної роботи повинен містити текстову частину завдання та скріншоти з командами та відповідною відповіддю на цю команду. В кінці звіту обов'язково повинен бути висновок. 190 | -------------------------------------------------------------------------------- /redis/lab2/lab_2.md: -------------------------------------------------------------------------------- 1 | ## Лабораторна робота №2 2 | ### Знайомство з Redis 3 | 4 | #### Мета: Продовження роботи з типами даних в сховищі Redis: списки, множини, впорядковані множини. Адміністрування Redis (TTL, налаштування паролю). 5 | 6 | Виконання цієї лабораторної роботи підрозуміває, що Redis встановлений при виконанні попередньої лабораторної та книга опрацьована/прочитана 📚 [“The Little Redis Book” Karl Seguin](https://github.com/akandratovich/the-little-redis-book/tree/master/ru) 7 | 8 | ### Хід Роботи 9 | 10 | #### 1.1 Списки (lists) 11 | Cписки дозволяють зберігати та маніпулювати масивами значень для заданого ключа. Можна додавати значення в список, отримувати перше та останнє значення зі списку та маніпулювати значеннями зі заданими індексами. Списки зберігають порядок своїх значень та мають ефективні операції з використанням індексів. 12 | ##### 🎯 Завдання: 13 | 1. Створити список який описує будь яку послідовність дій (від 5). Ключ - ваше прізвище. 14 | В моєму випадку це дії користувача на сайті: 15 | ```console 16 | lpush user:123 open:page1 open:page2 order:ticket order:ticket2 buy:all 17 | ``` 18 | 2. Вивести всі значення у вашому списку (LRANGE). 19 | 3. Скоротити список до 3 (останніх, тобто самих актуальних) елементів (LTRIM) однією командою. 20 | 21 | #### 1.2 Множини(Sets) 22 | 23 | Множини використовуються для зберігання унікальних значень і представляють набір операцій - таких, як об’єднання. Множини не впорядковані, але представляють ефективні операції із значеннями. Список друзів являється класичним прикладом множин: 24 | ```console 25 | sadd friends:leto ghanima paul chani jessica 26 | sadd friends:duncan paul jessica alia 27 | ``` 28 | Незалежно від того, скільки друзів має користувач, ми можемо ефективно (O(1)) визначити, чи є користувач userX і userY друзями чи ні. 29 | ```console 30 | sismember friends:leto jessica 31 | sismember friends:leto vladimir 32 | ``` 33 | ##### 🎯 Завдання: 34 | 1. Створити множину предметів першого і другого семестру (від 5). 35 | ```console 36 | sadd subject:1 subjectX ... 37 | sadd subject:2 subjectY ... 38 | ``` 39 | 2. Взяти будь який предмет з списку та перевірити, чи є він у множині першого і другого семестру. 40 | 3. Перевірити чи є предмети, які спільні для першого і другого семестру та зберегти їх під іншим ключем (SINTERSTORE). 41 | 42 | 43 | #### 1.3 Впорядковані множини (Sorted Sets) 44 | Останнім та самий потужним типом являються впорядковані множини. Хеші схожі на рядки, але мають поля, а впорядковані множини схожі на множини, але мають лічильники. Лічильники надають можливість впорядковувати та ранжувати. Якщо ми хочемо отримати список друзів, ми можемо зробити наступне: 45 | ```console 46 | zadd friends:leto 100 ghanima 95 paul 95 chani 75 jessica 1 vladimir 47 | ``` 48 | ##### 🎯 Завдання: 49 | 1. Створити впорядкований список предметів за перший семестр з їхніми оцінками (від 5 елементів). 50 | 2. Дізнатись кількість предметів, в яких оцінка більше 70 (ZRANGEBYSCORE). 51 | 3. Вивести порядковий рейтинг одного з предметів відносно інших (ZREVRANK). 52 | 53 | 54 | #### 2.1 TTL 55 | 56 | Redis дозволяє надавати ключам час існування (TTL, прим. - Time-to-live, час життя). Ви можете використовувати абсолютні значення в часі в форматі [Unix (Unix Timestamp)](https://www.unixtimestamp.com/), або час, який залишився ключу існувати. 57 | ```console 58 | expire pages:about 30 59 | expireat pages:about 1600473600 60 | ``` 61 | Перша команда видалить ключ через 30 секунд. Друга це зробить в 00:00, 19 вересня 2020 року. 62 | Це робить Redis ідеальною базою для кешування. Ви можете дізнатись, скільки ще буде існувати даний елемент за допомогою команди ttl, а також видалити срок існування за допомого команди persist. 63 | ##### 🎯 Завдання: 64 | 1. Створити ключ, який буде видаллений через 3*(ваш номер в списку) в секундах. 65 | 2. Створити ключ, який буде видалений у день вашого народження в 2022 році. 66 | 3. Дізнатись скільки обидва ключі будуть існувати. 67 | 68 | #### 2.2 Адміністрування Redis. 69 | Redis можно налаштувати так, щоб він вимагав пароль. За це відповідає спеціальна опція конфігурації requirepass (встановлюється через redis.conf або командою config set). Коли опція requirepass встановлюється в будь-яке значення (пароль), клієнт повинен виконати авторизацію auth password при з’єднанні з сервером. Як тільки клієнт пройде авторизацію він може виконати будь яку команду в будь якій базі. У тому числі FLUSHALL, яка видаляє всі ключі зs всіх баз. 70 | Конфігураційний файл можна редагувати через CLI за допомогою редактора nano або vim: 71 | 72 | ```console 73 | sudo nano /etc/redis/redis.conf 74 | ``` 75 | У відкритому файлі можна буде замінити команду FLUSHALL, яка знаходится в заголовці Security. Писати команду потрібно нижче зазначеного прикладу. Для збереження змін натискаємо CTRL + X та підтверджуємо зміни. Але зауваження: зміни спрацюють тільки після перезапуску сервера. Тому, можемо скористатися командою, яка наведена нижче: 76 | 77 | ```console 78 | sudo /etc/init.d/redis-server restart 79 | ``` 80 | 81 | #### 🎯 Завдання: 82 | 1. Потрібно налаштувати авторизацію (CONFIG SET requirepass "mypass") на ваш сервер. Логін повинен містити ваше ім'я та прізвище. 83 | 2. Перейменувати команду FLUSHALL (rename-command CONFIG) для забезпечення певного рівня захисту, перейменована команда FLUSHALL повинна містити в собі ваш номер у списку групи та прізвище. 84 | 85 | ##### Вимоги до оформлення 86 | Звіт лабораторної роботи повинен містити текстову частину завдання та скріншоти з командами та відповідним виводом. В кінці звіту обов'язково повинен бути висновок. 87 | --------------------------------------------------------------------------------