ΠΠ΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°ΡΡ WebApi Π΄Π»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΡ Π·Π°Π΄Π°Ρ:
1. Π‘ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°ΡΡ ΡΡΡΡΠΊΡΡΡΡ ΠΠ Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΠΌΠ°ΡΠΊΠ°Ρ , ΠΌΠΎΠ΄Π΅Π»ΡΡ , Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΡ ΠΈ ΡΠ°ΠΌΠΈΡ Π°Π²ΡΠΎΠΌΠΎΠ±ΠΈΠ»ΡΡ .
ΠΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ Π±Π°Π·Π° Π΄Π°Π½Π½ΡΡ Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ:
Π‘ΠΎΠ΄Π΅ΡΠΆΠ°Π½ΠΈΠ΅ ΡΠ°Π±ΠΈΡΡ transport_type
Π‘ΠΎΠ΄Π΅ΡΠΆΠ°Π½ΠΈΠ΅ ΡΠ°Π±Π»ΠΈΡΡ transport_tax_rate
ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π΄Π°Π½Π½ΡΡ ΠΏΡΠΎΡ ΠΎΠ΄ΠΈΡ Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ . ΠΠΎΠ΄ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ:
CREATE TABLE IF NOT EXISTS public.transport_type
(
type text COLLATE pg_catalog."default" NOT NULL,
CONSTRAINT type_transport_pkey PRIMARY KEY (type)
)
CREATE TABLE IF NOT EXISTS public.transport_tax_rate
(
id integer NOT NULL DEFAULT nextval('transport_tax_rate_id_seq'::regclass),
transport_type text COLLATE pg_catalog."default" NOT NULL,
min_horsepower integer NOT NULL,
max_horsepower integer,
tax_rate integer NOT NULL,
CONSTRAINT transport_tax_rate_pkey PRIMARY KEY (id),
CONSTRAINT transport FOREIGN KEY (transport_type)
REFERENCES public.transport_type (type) MATCH FULL
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT transport_tax_rate_check CHECK (max_horsepower = NULL::integer OR min_horsepower < max_horsepower)
)
CREATE TABLE IF NOT EXISTS public.driver
(
passport text COLLATE pg_catalog."default" NOT NULL,
last_name text COLLATE pg_catalog."default" NOT NULL,
name text COLLATE pg_catalog."default" NOT NULL,
patronymic text COLLATE pg_catalog."default",
birthday date NOT NULL,
CONSTRAINT driver_pkey PRIMARY KEY (passport),
CONSTRAINT driver_birthday_check CHECK (EXTRACT(year FROM age(birthday::timestamp with time zone)) >= 18::numeric),
CONSTRAINT driver_passport_check CHECK (passport ~* '\d{4} \d{6}'::text)
)
CREATE TABLE IF NOT EXISTS public.transport_brand
(
brand text COLLATE pg_catalog."default" NOT NULL,
CONSTRAINT transport_brand_pkey PRIMARY KEY (brand)
)
CREATE TABLE IF NOT EXISTS public.transport_model
(
model text COLLATE pg_catalog."default" NOT NULL,
brand text COLLATE pg_catalog."default" NOT NULL,
horsepower integer NOT NULL,
release_year integer NOT NULL,
transport_type text COLLATE pg_catalog."default" NOT NULL,
CONSTRAINT transport_model_pkey PRIMARY KEY (model),
CONSTRAINT transport_model_brand_fkey FOREIGN KEY (brand)
REFERENCES public.transport_brand (brand) MATCH SIMPLE
ON UPDATE CASCADE
ON DELETE CASCADE
NOT VALID,
CONSTRAINT transport_model_transport_type_fkey FOREIGN KEY (transport_type)
REFERENCES public.transport_type (type) MATCH SIMPLE
ON UPDATE CASCADE
ON DELETE CASCADE
NOT VALID,
CONSTRAINT transport_model_release_year_check CHECK (release_year >= 1900 AND release_year::double precision <= date_part('year'::text, now())),
CONSTRAINT transport_model_horsepower_check CHECK (horsepower > 0) NOT VALID
)
CREATE TABLE IF NOT EXISTS public.transport
(
number_transport text COLLATE pg_catalog."default" NOT NULL,
model text COLLATE pg_catalog."default" NOT NULL,
registration_date date NOT NULL,
driver text COLLATE pg_catalog."default" NOT NULL,
CONSTRAINT transport_driver_pkey PRIMARY KEY (number_transport),
CONSTRAINT transport_driver_fkey FOREIGN KEY (driver)
REFERENCES public.driver (passport) MATCH SIMPLE
ON UPDATE CASCADE
ON DELETE CASCADE
NOT VALID,
CONSTRAINT transport_model_transport_fkey FOREIGN KEY (model)
REFERENCES public.transport_model (model) MATCH SIMPLE
ON UPDATE CASCADE
ON DELETE CASCADE
NOT VALID,
CONSTRAINT transport_number_transport_check CHECK (number_transport ~* '^[ΠΠΠΠΠΠΠΠ Π‘Π’Π£Π₯][0-9]{3}[ΠΠΠΠΠΠΠΠ Π‘Π’Π£Π₯]{2}$'::text OR number_transport ~* '^[ΠΠΠΠΠΠΠΠ Π‘Π’Π£Π₯]{2}[0-9]{3,4}$'::text OR number_transport ~* '^[0-9]{4}[ΠΠΠΠΠΠΠΠ Π‘Π’Π£Π₯]{2}$'::text)
)
2. Π Π°Π·ΡΠ°Π±ΠΎΡΠ°ΡΡ WebApi Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ/Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ/ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΠΌΠ°ΡΠΊΠ°Ρ , ΠΌΠΎΠ΄Π΅Π»ΡΡ , Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΡ , Π°Π²ΡΠΎΠΌΠΎΠ±ΠΈΠ»ΡΡ .
ΠΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ WebApi
ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎΠ±ΠΎ Π²ΡΠ΅Ρ Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΡ
ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ Π²ΠΎΠ΄Π΅ΡΠ΅Π»Π΅ ΠΏΠΎ ΠΏΠ°ΡΠΏΠΎΡΡΡ. (%20 - ΠΏΡΠΎΠ±Π΅Π»).
ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π·Π°ΠΏΠΈΡΠΈ Ρ Π½Π΅ΠΏΡΠ°Π²Π»ΡΠ½ΠΎ Π²Π²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π΄Π°ΡΠΎΠΉ.
ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π²ΠΎΠ΄ΠΈΡΠ΅Π»Ρ Ρ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ Π²Π²Π΅Π΄Π΅Π½Π½ΡΠΌ ΠΏΠ°ΡΠΏΠΎΡΡΠΎΠΌ.
ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π²ΠΎΠ΄ΠΈΡΠ΅Π»Ρ Ρ ΠΏΠ°ΡΠΏΠΎΡΡΠΎΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΆΠ΅ Π΅ΡΡΡ Π² Π±Π΄.
ΠΡΠ²Π΅Ρ Π½Π° ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠ΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π²ΠΎΠ΄ΠΈΡΠ΅Π»Ρ.
ΠΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π·Π°ΠΏΠΈΡΠΈ.
ΠΠ΅ Π½Π°ΠΉΠ΄Π΅Π½Π° Π·Π°ΠΏΠΈΡΡ Ρ ΡΠ°ΠΊΠΈΠΌ ΠΏΠ°ΡΠΏΠΎΡΡΠΎΠΌ Π΄Π»Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ.
ΠΡΠ»ΠΈ Π±ΡΠ΄Π΅Ρ Π²Π²Π΅Π΄Π΅Π½Π° Π΄Π°ΡΠ° Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΠΈΠ»ΠΈ ΠΏΠ°ΡΠΏΠΎΡΡ (Π΅ΡΠ»ΠΈ ΡΠΊΠ°Π·Π°Π½ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΡΠΉ ΡΡΠ°ΡΡΠΉ ΠΏΠ°ΡΠΏΠΎΡΡ), ΡΠΎ ΠΎΡΠ²Π΅Ρ Π±ΡΠ΄Π΅Ρ ΡΠ°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ Π·Π°ΠΏΠΈΡΠΈ Ρ ΡΡΠΈΠΌΠΈ Π°ΡΡΠΈΠ±ΡΡΠ°ΠΌΠΈ.
Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ Π²ΠΎΠ΄ΠΈΡΠ΅Π»Ρ Ρ ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠ΅ΠΉ.
Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ Π²ΠΎΠ΄ΠΈΡΠ΅Π»Ρ ΠΏΠΎ ΠΏΠ°ΡΠΏΠΎΡΡΡ.
Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ Π½Π΅ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠ΅ΠΉ Π·Π°ΠΏΠΈΡΠΈ.