Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Курсовая работа. БД-1

.pdf
Скачиваний:
0
Добавлен:
07.01.2025
Размер:
7.39 Mб
Скачать

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