homework, pet project DE Dmitry_Medvedev #1

Open
dmitry_medvedev wants to merge 264 commits from md_branch into main
Showing only changes of commit 783c875925 - Show all commits
@@ -0,0 +1,111 @@
/*Задание 1: По каким полям делать индексы(тут говорится смотреть на таблицы из пет проекта 'Онлайн магазины', надеюсь смотреть на таблицы а не на витрины):
1) По каким полям, как тебе кажется, реальный продукт‑менеджер или аналитик будет чаще всего:
where:
users: age, email, registration_date,
enrollments: enrolled_at
courses: title, category
lessons: title, duration_min
lesson_views: viewed_at
order by:
users: id, age, registration_date
enrollments: user_id, enrolled_at
courses: id
lessons: id, duration_min
lesson_views: user_id, viewed_at
group by:
users: age, registration_date
enrollments: user_id, course_id, enrolled_at
courses: category
lessons: course_id
lesson_views: user_id, lesson_id
join:
users: id
enrollments: user_id, course_id
courses: id
lessons: id, course_id
lesson_views: user_id, lesson_id
2) Для каждого поля, которое ты назвал, укажи: «индекс нужен / индекс не нужен» и коротко объясни почему (часто фильтруем, редко фильтруем, мало разных значений и т.п.).
users:
id(есть автоматически),
age(не нужен, мало разнах значений),
email(нужен, чтобы найти пользователя через where)
registration_date(нужен, часто будет сравниваться в BETWEEN наприме, и сортироваться)
enrollments:
user_id(нужен, будет часто джоиниться),
course_id(нужен, будет часто джоиниться),
enrolled_at(нужен, часто будет сравниваться в BETWEEN например, и сортироваться)
courses:
id(есть автоматически),
title(не нужен, мало разных значений),
category(не нужен, мало разных значений)
lessons:
id(есть автоматически),
course_id(нужен, будет часто джоиниться),
title(не нужен, мало разных значений),
duration_min(мне кажется не нужен, тк не очень часто будет использоваться)
lesson_views:
user_id(нужен, будет часто джоиниться),
lesson_id(нужен, будет часто джоиниться)
viewed_at(нужен, часто будет сравниваться в BETWEEN например, и сортироваться)*/
-- Задание 2: Свяжи запрос и индекс:
-- 1)
SELECT * FROM users WHERE email = 'какой-то email'; -- индекс на email ускорит where
-- 2)
SELECT * FROM users WHERE is_active = true AND created_at >= CURRENT_DATE - INTERVAL '1 year'; -- индекс на created_at ускоряет where
-- 3)
SELECT * FROM products WHERE category = 'Электроника' ORDER BY price; -- индекс по price ускорит order by
-- 4)
SELECT * FROM orders WHERE user_id = 1 AND order_date >= CURRENT_DATE - INTERVAL '30 days'; -- индекс на user_id и order_date ускорят where
-- 5)
SELECT order_id, product_id FROM order_items; -- на у тут по идее составной создается сразу, так как тут pkey составной. Ну и они ускоряют select
/* Задание 3. Порядок столбцов в индексе
1) Я бы сделал orders(order_date, user_id).
2) Для первых двух будет работать четко, а для третьего хуже. Тк у третьего нет фильрации по order date, и он стоит вторым в индексе
3)
* Когда один индекс - хорошо с фильтрацией по нескольким полям, и когда первое поле указанное в индексе используется часто, а второе нет.
* Когда индекса два - хорошо когда оба поля фильтруются по отдельности*/
/* Задание 4. Лишние индексы в наших таблицах
!!! Я тут не буду писать индексы которые создаются автоматически из за pkey
users:
Скорее нужен индекс:
email, created_at(нужны для where, и order by)
Скорее не нужен индекс:
name, age, country, is_active(либо мало рахных значений, либо не очень востребованы эти поля)
products:
Скорее нужен индекс:
price (для order by и where)
Скорее не нужен индекс:
name, ctegory, in_stock(либо мало разных значений, либо не очень востребованы эти поля)
orders:
Скорее нужен индекс:
user_id(для join), price(для order by и where)
Скорее не нужен индекс:
name, category, in_stock(либо мало разных значений, либо не очень востребованы эти поля)
order_items:
Скорее нужен индекс:
price_at_purchase (для order by и where)
Скорее не нужен индекс:
quantity(мало разных значения)
Много индексов не есть хорошо, потому что они тоже занимают помять и их тоже нужно считать. Если их бездумно везде понатыкать то запрос может выполняться дольше.*/
/* Задание 5. Что должно быть уникальным
1) id, email
2) id, article_number(придумал вот такое)
3)
* Если не будет уникаьности по id, то возникнут проблемы бд, что у разных пользователей будет один id и это жопа, ничего невозможно фильтровать и тд.
* Если email будет повторяться, то как вообще пользователи будут входить в аккаунт, и как делать персонализированную рассылку? Никак.
* Если article_number будет повторяться, то те же проблемы что и с id, будет нарушение логики работы бд.
* Уникальный индекс обезопасит бд от сбоев и некорректной работы.*/
-- Задание 6. Где индексы помогут, а где нет
SELECT * FROM users WHERE id = 100; -- индекс уже создан тк это pkey
SELECT * FROM users WHERE email = 'user@example.com'; -- нужен, поможет с where, быстрее будет рабоать фильтрация
SELECT * FROM products WHERE price BETWEEN 100 AND 500; -- нужн, поможет с where, быстрее будте фильтрация
SELECT * FROM products WHERE name LIKE '%phone%'; -- не нужен, индекс не рвботает с like
SELECT * FROM orders WHERE status = 'DELIVERED'; -- не нужен, в status мало разных значений
SELECT * FROM order_items WHERE order_id = 123; -- нужен, поможет с where, быстрее будет рабоать фильтрация