Zpět na domů

Architektura DB pro parsování tarifů na PostgreSQL

Článek popisuje relační schéma ve formátu hvězdy pro ukládání dat o tarifech poskytovatelů internetu a TV na PostgreSQL. Zahrnuje tabulky dimenzí a faktů, řízení historizace prostřednictvím triggerů, optimalizující indexy. Vhodné pro automatizovaný monitoring a analýzu.

Schéma DB hvězdy: tarify poskytovatelů v PostgreSQL
Advertisement 728x90

# Architektura relační databáze pro monitorování tarifů poskytovatelů

Vývojáři telekomunikačních projektů se často setkávají s potřebou ukládat dynamická data o tarifech internetu a TV. Navržená struktura na PostgreSQL využívá schéma „Hvězda“ s centrální faktovou tabulkou plans a dimenzemi cities, providers. To zajišťuje efektivní dotazy pro analýzu a srovnání nabídek podle regionů.

Model podporuje historizaci změn: tarify a poskytovatelé se deaktivují bez odstraňování záznamů, což je klíčové pro audity a reporty.

Tabulky dimenzí: základní entity

Dimenzím se ukládají statické atributy. Města – jednoduchá referenční tabulka bez historizace.

Google AdInline article slot
-- Goroda
CREATE TABLE IF NOT EXISTS cities (
	id BIGINT GENERATED ALWAYS AS IDENTITY,
	city_name VARCHAR (100) NOT NULL,
	CONSTRAINT pk_cities_id PRIMARY KEY (id)
);

COMMENT ON TABLE cities IS 'Table with gorodami Rossii';
COMMENT ON COLUMN cities.id IS 'Unique identifier cities';
COMMENT ON COLUMN cities.city_name IS 'Name cities';

Poskytovatelé zahrnují časové razítka pro sledování období aktivity:

-- Provaydery
CREATE TABLE IF NOT EXISTS providers (
	id BIGINT GENERATED ALWAYS AS IDENTITY,
	provider_name VARCHAR (100),
	start_date DATE DEFAULT CURRENT_DATE,
	end_date DATE DEFAULT NULL,
	CONSTRAINT pk_providers_id PRIMARY KEY (id)
);

COMMENT ON TABLE providers IS 'Table with imenami provayderov';
COMMENT ON COLUMN providers.id IS 'Unique identifier provider';
COMMENT ON COLUMN providers.provider_name IS 'Name provider';
COMMENT ON COLUMN providers.start_date IS 'Date nachala action provider';
COMMENT ON COLUMN providers.end_date IS 'Date okonchaniya action provider';

Faktová tabulka: detailizace tarifů

Centrální tabulka agreguje všechny atributy tarifů s cizími klíči na dimenze. Pole pokrývají rychlost internetu, TV balíčky, doplňkové služby a cenotvorbu.

-- Tarify
CREATE TABLE IF NOT EXISTS plans(
	id BIGINT GENERATED ALWAYS AS IDENTITY,
	city_id BIGINT,
    provider_id BIGINT,
	tariff_name VARCHAR(100) NOT NULL, -- name tarifa
	internet_speed INT, -- skorost interneta
	tv_channels INT, -- count kanalov
	has_cinema VARCHAR(255), -- onlayn kinoteatr
	has_mobile VARCHAR(255), -- mobilnaya connection
	other VARCHAR(255), -- prochee
	connection_cost DECIMAL(10, 2) DEFAULT 0, -- price for podklyuchenie
	monthly_cost DECIMAL(10, 2) NOT NULL, -- ezhemesyachnaya oplata
	discount_cost DECIMAL(10, 2), -- price so skidkoy
	discount_description VARCHAR(255), -- skidochnye sentences, description
	start_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
	end_at TIMESTAMP DEFAULT NULL,
	CONSTRAINT pk_tariffs_id PRIMARY KEY (id),
	CONSTRAINT fk_tariffs_city_providers_id FOREIGN KEY (city_providers_id) REFERENCES city_providers (id)
);

Všechny klíče jsou pojmenované pro usnadnění údržby:

Google AdInline article slot
  • CONSTRAINT ogranichenie_for_pk_id PRIMARY KEY (id)
  • CONSTRAINT ogranichenie_for_fk_id FOREIGN KEY (id) REFERENCES (id)
  • CONSTRAINT uq_city_provider UNIQUE (city_id, provider_id)

Řízení historizace prostřednictvím triggerů

Každá měnitelná entita (kromě měst) má start_at, updated_at, end_at. Trigery automatizují aktualizace.

Základní struktura pro entity:

CREATE TABLE IF NOT EXISTS suschnosti (
 -- ...
 start_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
 updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
 end_at TIMESTAMP DEFAULT NULL, -- NULL znachit «deystvuet to sikh por»
);

Trigger na změny:

Google AdInline article slot
CREATE OR REPLACE FUNCTION function_reagiruyuschaya_on_changes()
RETURNS TRIGGER AS $$
BEGIN
-- When any change menyat datu updated_at
NEW.updated_at = CURRENT_TIMESTAMP;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;

Kaskádová deaktivace: při end_date poskytovatele všechny související tarify obdrží end_at. To je realizováno prostřednictvím triggerů na UPDATE a DELETE.

Optimalizace výkonu

Indexy zrychlují JOINy a filtry podle regionů/poskytovatelů. Vytváření concurrent pro produkci:

CREATE INDEX CONCURRENTLY idx_city_provider_city_id ON city_provider (city_id);
CREATE INDEX CONCURRENTLY idx_city_provider_provider_id ON city_provider (provider_id);
CREATE INDEX CONCURRENTLY idx_plans_city_provider_id ON plans (city_providers_id);

Výhody indexování:

  • Zrychlení dotazů na aktuální tarify (WHERE end_at IS NULL)
  • Efektivní agregace podle monthly_cost, internet_speed
  • Podpora složitých analytických dotazů s GROUP BY podle poskytovatelů

Co je důležité

  • Schéma „Hvězda“: Optimální pro OLAP dotazy v telekomunikační analytice, minimalizuje JOINy.
  • Historizace: Automatické trigery zabraňují ztrátě dat při deaktivaci tarifů.
  • Pojmenované omezení: Zjednodušují migrace a ladění ve velkých projektech.
  • Indexy concurrent: Umožňují přidávání bez blokování produkčního provozu.
  • Rozšiřitelnost: Snadno přidat pole pro nové služby (VoIP, mesh-sítě).

— Editorial Team

Advertisement 728x90

Číst dál