
Курсовая работа. БД-1
.pdf
31
Рисунок 33 - Результат создания триггера и функции
Содержимое таблицы users перед обновлением записи:
Рисунок 34 - Содержимое таблицы friends

32
Также стоит учесть то, что ранее был создан триггер на удаление записей из таблицы friends, которые производит манипуляции в таблице friend_group. Ее содержимое также следует проверить, рисунок 35.
Рисунок 35 - Содержимое таблицы friend_group до обновления
Выполним запросы:
update users set active = false where id = 54 or id = 26;
Рисунок 36 - Результат выполнения запроса

33
Рисунок 37 - Результат после обновления записей в таблице users
Рисунок 38 - Результат после обновления записей в таблице users

34
Визуализация данных
Круговая диаграмма, на которой отражены 5 самых частовстречающихся имен в социальной сети, изображена на рисунке 39.
Рисунок 39 - Круговая диаграмма популярности имен
Листинг программы: import pandas as pd
import matplotlib.pyplot as plt import psycopg2
conn = psycopg2.connect(dbname='social_network', user='root', password='root', host='localhost')
cursor = conn.cursor()
cursor.execute("select firstname, count(firstname) " "from users u "
"group by firstname "
"order by count(firstname) DESC " "limit 5;")
rows = cursor.fetchall() df = pd.DataFrame(rows)

35
print(df) titles = df[0] counts = df[1]
plt.figure(figsize=(10, 7))
plt.pie(counts, labels=titles, autopct='%1.1f%%', startangle=140) plt.axis('equal')
plt.title("Распределение популярности имен") plt.show()
Столбчатая диаграмма с количеством друзей(взаимной дружбы) у первых 5 пользователей с наибольшим числом друзей представлена на рисунке 40.
Рисунок 40 - Количество друзей у 5 пользователей
Листинг программы:
import pandas as pd
import matplotlib.pyplot as plt import psycopg2
conn = psycopg2.connect(dbname='social_network', user='root', password='root', host='localhost')
cursor = conn.cursor()

36
cursor.execute("select u.firstname || ' ' || u.lastname || ' ' || coalesce(u.patronymic, ''), count(u.id) as count_friends from friends f "
"inner join friends uf on uf.friend_id = f.user_id
and uf.user_id = f.friend_id "
"left join users u on u.id = f.user_id "
"group by u.id, u.firstname, u.lastname, u.patronymic
"
"order by count(u.id) desc " "limit 5;")
rows = cursor.fetchall() df = pd.DataFrame(rows) print(df)
plt.figure()
plt.tick_params(axis='x', rotation=11) plt.bar(df[0], df[1])
plt.show()
Столбчатая диаграмма, отражающая популярность всех встречающихся хобби у пользователей социальной сети изображен на рисунке 41.
Рисунок 41 - Популярность хобби

37
Листинг программы: import pandas as pd
import matplotlib.pyplot as plt import psycopg2
conn = psycopg2.connect(dbname='social_network', user='root', password='root', host='localhost')
cursor = conn.cursor()
cursor.execute( |
"SELECT h, |
COUNT(*) |
" |
|
|
|
|
|
|
|
|
|
"FROM users |
" |
|
|
|
|
|
|
|
|
|
|
"CROSS JOIN |
UNNEST(users.hobbies) AS h |
" |
||
|
|
|
|
|
|
|
"GROUP BY h |
" |
|
|
"order by COUNT(*) DESC;") rows = cursor.fetchall()
df = pd.DataFrame(rows)
# Построим график plt.figure(figsize=(10, 6)) plt.bar(df[0], df[1]) plt.xlabel('Hobby') plt.ylabel('Number of Users') plt.title('Count of Users by Hobby') plt.xticks(rotation=45)
plt.show()
38
Заключение
Вэтой курсовой работой передо мной была поставлена задача создать базу данных для социальной сети. Для начала я создал несколько таблиц, включая "пользователи", "группы друзей", "друзья", "сообщества", связующие таблицы для сообществ и пользователей, также для групп и друзей. В этих таблицах эффективно хранится вся необходимая информация для работы социальной сети, такая как информация о пользователях, сообществах, группах друзей и т.д.. Также были описаны связи между этими таблицами, чтобы обеспечить целостность данных и сделать поиск данных более эффективным. По этой части сложностей, практически, не возникло, так как подобным я уже занимался.
Затем я создал различные запросы для получения требуемой информации из базы данных. Подготовка данных была лишь малой частью этого этапа. А вот запросы были не очень просты. С учетом того, что приходилось сводить множество таблиц, а местами, это нужно было делить на этапы(отдельные части), чтобы получить в результате необходимую информацию.
Кроме того, я создал функции для части запросов, из описанных выше и для некоторых новых. Эти функции обеспечивают легкий доступ к информации, полученной с помощью запросов, а также включают обработку ошибок при получении некорректных данных.
Для обеспечения безопасности и целостности данных я также создал различные триггеры. Эти триггеры включают проверку достоверности введенных значений для каждой таблицы, проверку ссылочной целостности данных, а также триггеры для автоматического обновления и удаления данных. Например, я создал триггер, который удаляет записи из связующей таблицы групп и друзей, так как при переходе двусторонней дружбы в одностороннюю - записи связей группы с этой дружбой - должны быть удалены.
Наконец, я также продемонстрировал, как визуализировать данные из базы данных “Социальная сеть” с помощью Python. Я использовал библиотеки Python, такие как matplotlib и pandas.
Вцелом, эта курсовая работа стала для меня прекрасной возможностью приобрести
изакрепить новые навыки в работе с базой данных PostgreSQL, составлении запросов, хранимых процедур, триггеров и визуализации данных. База данных "Социальная сеть" представляет собой хорошо продуманную и функциональную систему, которая эффективно хранит и управляет всей необходимой информацией для работы социальной
39
сети. Я уверен, что эта база данных окажет большую помощь в эффективном и организованном управлении социальной сетью.
40
Список использованных источников
1)Методические указания по выполнению лабораторной работы: https://pro.guap.ru/inside/student/tasks/e020d6752d313c64ed266d64d6dc94a1/download
2)Документаци по триггерам в PostgreSQL: https://www.postgresql.org/docs/current/sql-createtrigger.html
3)Документация по работе с функциями в PostgreSQL: https://www.postgresql.org/docs/current/sql-createfunction.html
4)Документация по ddl-операциям в PostgreSQL: https://www.postgresql.org/docs/current/ddl-alter.html
5)Работа с функцией array_agg и группировкой: https://stackoverflow.com/questions/34978172/counting-columns-null-and-not-null-in-po stgresql
6)Установка и настройка PostgreSQL: https://timeweb.cloud/docs/unix-guides/installing-and-using-postgresql
7)Документация по оператору WITH в PostgreSQL: https://www.postgresql.org/docs/current/queries-with.html
8)Документация по работе с библиотекой psycopg2: https://metanit.com/python/database/2.1.php
9)Документация по работе с plot: https://www.geeksforgeeks.org/plot-a-pie-chart-in-python-using-matplotlib/
10)Документаци по установке библиотеки для работы c PostgreSQL: https://khashtamov.com/ru/postgresql-python-psycopg2/
11)Описание оператора для проверки наличия значения в массиве из PostgreSQL: https://stackoverflow.com/questions/16606357/how-to-make-a-select-with-array-contains -value-clause-in-psql
12)Документация по возвращаемым типам функции в PostgreSQL: https://www.postgresql.org/docs/current/plpgsql-control-structures.html
13)Информация о СУБД PostgreSQL: https://ru.wikipedia.org/wiki/PostgreSQL
14)Структура и описание работы с PostgreSQL: https://habr.com/ru/companies/otus/articles/706346/
15)Развертка PostgreSQL в Docker-контейнере: https://hub.docker.com/_/postgres