diff --git a/README.md b/README.md index e69de29..f31b2d9 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,4 @@ +# data_engineer_fasrpost + +# Запуск +```docker compose up -d``` \ No newline at end of file diff --git a/compose.yaml b/compose.yaml new file mode 100644 index 0000000..b22b355 --- /dev/null +++ b/compose.yaml @@ -0,0 +1,26 @@ +name: data_engineer-farpost + +services: + database: + container_name: farpost-database + restart: always + image: postgres:latest + volumes: + - ./dump.sql:/docker-entrypoint-initdb.d/dump.sql:ro + - postgres-data:/var/lib/postgresql/data + healthcheck: + test: pg_isready -d log + interval: 60s + start_period: 1s + timeout: 600s + ports: + - 5432:5432 + environment: + POSTGRES_DB: log + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + + +volumes: + postgres-data: + name: farpost-postgres-data diff --git a/dump.sql b/dump.sql new file mode 100644 index 0000000..6780887 --- /dev/null +++ b/dump.sql @@ -0,0 +1,75 @@ +-- +-- PostgreSQL database dump +-- + +-- Dumped from database version 17.3 (Debian 17.3-3.pgdg120+1) +-- Dumped by pg_dump version 17.3 (Debian 17.3-3.pgdg120+1) + +SET statement_timeout = 0; +SET lock_timeout = 0; +SET idle_in_transaction_session_timeout = 0; +SET transaction_timeout = 0; +SET client_encoding = 'UTF8'; +SET standard_conforming_strings = on; +SELECT pg_catalog.set_config('search_path', '', false); +SET check_function_bodies = false; +SET xmloption = content; +SET client_min_messages = warning; +SET row_security = off; + +-- +-- Name: user_actions; Type: TYPE; Schema: public; Owner: postgres +-- + +CREATE TYPE public.user_actions AS ENUM ( + 'first_entry', + 'registration', + 'login', + 'logout', + 'create_theme', + 'entry_theme', + 'delete_theme', + 'write_message' +); + + +ALTER TYPE public.user_actions OWNER TO postgres; + +SET default_tablespace = ''; + +SET default_table_access_method = heap; + +-- +-- Name: log; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.log ( + id integer NOT NULL, + user_id integer NOT NULL, + action public.user_actions NOT NULL, + datetime timestamp with time zone DEFAULT (now() AT TIME ZONE 'EAST'::text) NOT NULL, + object_id integer, + response smallint NOT NULL +); + + +ALTER TABLE public.log OWNER TO postgres; + +-- +-- Data for Name: log; Type: TABLE DATA; Schema: public; Owner: postgres +-- + + + +-- +-- Name: log log_pk; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.log + ADD CONSTRAINT log_pk PRIMARY KEY (id); + + +-- +-- PostgreSQL database dump complete +-- + diff --git a/tasks/1.md b/tasks/1.md new file mode 100644 index 0000000..f2cc3c3 --- /dev/null +++ b/tasks/1.md @@ -0,0 +1,32 @@ +1. Спроектировать схему БД +я здесь вижу 2 варианта развития +1) сделать одну таблицу в которой будет: + - id пользователя + - время выполненного дйствия + - enum из различный действия (бэку не нужно лишний раз искать id действия, чтобы закрепить его в таблице логов) + - (отдельная таблица для действий будет лишней) + - (бэку необходимо знать и контролировать все действия, а таблица будет лишь означать изменение данных извне, которое будет либо бесполезной, либо опасной, когда бэк не найдёт нужное действие) +2) разбить на несколько таблиц: + - таблица логов аккаунта + - таблица работы с темой + - таблица работы с сообщениями + +- 1 вариант - + 1) ускоренная разработка из-за отсутсвия необходимости задумываться над подтягиванием данных из других таблиц (join, lazy_loading, selectin) + 2) простота работы с данными: SQL запросы намного проще, более удобный перенос в csv +- 2 вариант - + 1) БД более подготовлена к изменению или усложенению архитектуры + 2) повышение эффективности за счёт меньшего количества столбцов + +в ТЗ не было речи про дальнейшую судьбу этой БД, так что я пойду на 1 вариант + +``` +CREATE TABLE public.log ( + id integer NOT NULL, + user_id integer NOT NULL, + action public.user_actions NOT NULL, + datetime timestamp with time zone DEFAULT (now() AT TIME ZONE 'EAST'::text) NOT NULL, + object_id integer, + response smallint NOT NULL +); +``` \ No newline at end of file diff --git a/tasks/2.md b/tasks/2.md new file mode 100644 index 0000000..e69de29