En aquest tema, explorarem com utilitzar PostgreSQL per a la creació i gestió d'un magatzem de dades. Un magatzem de dades és una base de dades dissenyada per a la consulta i anàlisi de grans volums de dades històriques. A diferència de les bases de dades transaccionals, que estan optimitzades per a operacions de lectura i escriptura ràpides, els magatzems de dades estan optimitzats per a consultes complexes i anàlisi de dades.
Objectius del tema
- Entendre els conceptes bàsics d'un magatzem de dades.
- Aprendre a dissenyar un esquema de magatzem de dades.
- Implementar un magatzem de dades utilitzant PostgreSQL.
- Optimitzar el rendiment del magatzem de dades.
Conceptes bàsics del magatzem de dades
Característiques principals
- Integració de dades: Recopila dades de diverses fonts.
- Històric de dades: Emmagatzema dades històriques per a l'anàlisi a llarg termini.
- Optimització per a consultes: Dissenyat per a consultes complexes i anàlisi de dades.
- No volàtil: Les dades no es modifiquen un cop s'han carregat al magatzem.
Components principals
- ETL (Extracció, Transformació i Càrrega): Procés de recopilació de dades de diverses fonts, transformació de les dades en un format adequat i càrrega al magatzem de dades.
- Esquema de magatzem de dades: Estructura de la base de dades que inclou taules de fets i taules de dimensions.
- OLAP (Processament Analític en Línia): Tecnologia que permet realitzar consultes complexes i anàlisi de dades.
Disseny d'un esquema de magatzem de dades
Esquema estrella
L'esquema estrella és un dels dissenys més comuns per a magatzems de dades. Consta d'una taula central de fets i diverses taules de dimensions que es connecten a la taula de fets.
Taula de fets
- Emmagatzema dades quantitatives (mètriques) que es volen analitzar.
- Conté claus foranes que es relacionen amb les taules de dimensions.
Taules de dimensions
- Emmagatzemen dades descriptives que proporcionen context a les dades de la taula de fets.
- Contenen claus primàries que es relacionen amb les claus foranes de la taula de fets.
Exemple d'esquema estrella
Taula de fets: sales
| id | date_id | product_id | store_id | quantity | total_amount |
|---|---|---|---|---|---|
| 1 | 20230101 | 101 | 1 | 5 | 100.00 |
Taula de dimensions: date
| date_id | date | year | month | day |
|---|---|---|---|---|
| 20230101 | 2023-01-01 | 2023 | 1 | 1 |
Taula de dimensions: product
| product_id | name | category | price |
|---|---|---|---|
| 101 | Widget A | Gadgets | 20.00 |
Taula de dimensions: store
| store_id | name | location |
|---|---|---|
| 1 | Store 1 | City A |
Implementació d'un magatzem de dades amb PostgreSQL
Creació de taules
-- Taula de fets
CREATE TABLE sales (
id SERIAL PRIMARY KEY,
date_id INT,
product_id INT,
store_id INT,
quantity INT,
total_amount NUMERIC,
FOREIGN KEY (date_id) REFERENCES date(date_id),
FOREIGN KEY (product_id) REFERENCES product(product_id),
FOREIGN KEY (store_id) REFERENCES store(store_id)
);
-- Taula de dimensions: date
CREATE TABLE date (
date_id INT PRIMARY KEY,
date DATE,
year INT,
month INT,
day INT
);
-- Taula de dimensions: product
CREATE TABLE product (
product_id INT PRIMARY KEY,
name VARCHAR(255),
category VARCHAR(255),
price NUMERIC
);
-- Taula de dimensions: store
CREATE TABLE store (
store_id INT PRIMARY KEY,
name VARCHAR(255),
location VARCHAR(255)
);Inserció de dades
-- Inserir dades a la taula de dimensions: date INSERT INTO date (date_id, date, year, month, day) VALUES (20230101, '2023-01-01', 2023, 1, 1); -- Inserir dades a la taula de dimensions: product INSERT INTO product (product_id, name, category, price) VALUES (101, 'Widget A', 'Gadgets', 20.00); -- Inserir dades a la taula de dimensions: store INSERT INTO store (store_id, name, location) VALUES (1, 'Store 1', 'City A'); -- Inserir dades a la taula de fets: sales INSERT INTO sales (date_id, product_id, store_id, quantity, total_amount) VALUES (20230101, 101, 1, 5, 100.00);
Optimització del rendiment
Índexs
Els índexs poden millorar significativament el rendiment de les consultes en un magatzem de dades.
-- Crear índexs a les claus foranes de la taula de fets CREATE INDEX idx_sales_date_id ON sales(date_id); CREATE INDEX idx_sales_product_id ON sales(product_id); CREATE INDEX idx_sales_store_id ON sales(store_id);
Particionament
El particionament de taules pot ajudar a gestionar grans volums de dades dividint una taula gran en taules més petites.
-- Crear una taula particionada per any
CREATE TABLE sales_partitioned (
id SERIAL PRIMARY KEY,
date_id INT,
product_id INT,
store_id INT,
quantity INT,
total_amount NUMERIC
) PARTITION BY RANGE (date_id);
-- Crear particions per any
CREATE TABLE sales_2023 PARTITION OF sales_partitioned
FOR VALUES FROM (20230101) TO (20240101);Exercici pràctic
Exercici
- Crea un esquema estrella per a un magatzem de dades que emmagatzemi informació sobre les vendes de llibres. Inclou taules de dimensions per a
date,bookistore. - Inserta dades a les taules de dimensions i a la taula de fets.
- Crea índexs per a les claus foranes de la taula de fets.
- Implementa particionament per any a la taula de fets.
Solució
-- Taula de fets: book_sales
CREATE TABLE book_sales (
id SERIAL PRIMARY KEY,
date_id INT,
book_id INT,
store_id INT,
quantity INT,
total_amount NUMERIC,
FOREIGN KEY (date_id) REFERENCES date(date_id),
FOREIGN KEY (book_id) REFERENCES book(book_id),
FOREIGN KEY (store_id) REFERENCES store(store_id)
);
-- Taula de dimensions: date
CREATE TABLE date (
date_id INT PRIMARY KEY,
date DATE,
year INT,
month INT,
day INT
);
-- Taula de dimensions: book
CREATE TABLE book (
book_id INT PRIMARY KEY,
title VARCHAR(255),
author VARCHAR(255),
genre VARCHAR(255),
price NUMERIC
);
-- Taula de dimensions: store
CREATE TABLE store (
store_id INT PRIMARY KEY,
name VARCHAR(255),
location VARCHAR(255)
);
-- Inserir dades a les taules de dimensions
INSERT INTO date (date_id, date, year, month, day) VALUES
(20230101, '2023-01-01', 2023, 1, 1);
INSERT INTO book (book_id, title, author, genre, price) VALUES
(201, 'Book A', 'Author A', 'Fiction', 15.00);
INSERT INTO store (store_id, name, location) VALUES
(1, 'Store 1', 'City A');
-- Inserir dades a la taula de fets
INSERT INTO book_sales (date_id, book_id, store_id, quantity, total_amount) VALUES
(20230101, 201, 1, 3, 45.00);
-- Crear índexs a les claus foranes de la taula de fets
CREATE INDEX idx_book_sales_date_id ON book_sales(date_id);
CREATE INDEX idx_book_sales_book_id ON book_sales(book_id);
CREATE INDEX idx_book_sales_store_id ON book_sales(store_id);
-- Crear una taula particionada per any
CREATE TABLE book_sales_partitioned (
id SERIAL PRIMARY KEY,
date_id INT,
book_id INT,
store_id INT,
quantity INT,
total_amount NUMERIC
) PARTITION BY RANGE (date_id);
-- Crear particions per any
CREATE TABLE book_sales_2023 PARTITION OF book_sales_partitioned
FOR VALUES FROM (20230101) TO (20240101);Conclusió
En aquest tema, hem après els conceptes bàsics d'un magatzem de dades i com dissenyar i implementar un magatzem de dades utilitzant PostgreSQL. Hem explorat l'esquema estrella, la creació de taules, la inserció de dades, l'optimització del rendiment mitjançant índexs i particionament, i hem realitzat un exercici pràctic per reforçar els conceptes apresos. Amb aquests coneixements, estàs preparat per crear i gestionar magatzems de dades eficients amb PostgreSQL.
Curs de PostgreSQL
Mòdul 1: Introducció a PostgreSQL
Mòdul 2: Operacions bàsiques de SQL
Mòdul 3: Consultes SQL avançades
Mòdul 4: Disseny de bases de dades i normalització
Mòdul 5: Funcionalitats avançades de PostgreSQL
Mòdul 6: Optimització i millora del rendiment
- Optimització de consultes
- Estratègies d'indexació
- Analitzant el rendiment de les consultes
- Vacuuming i manteniment
Mòdul 7: Seguretat i gestió d'usuaris
- Rols d'usuari i permisos
- Mètodes d'autenticació
- Encriptació de dades
- Còpia de seguretat i restauració
Mòdul 8: Treballant amb JSON i funcionalitats NoSQL
Mòdul 9: Extensions i eines avançades
- PostGIS per a dades geoespacials
- Cerca de text complet
- Wrappers de dades externes
- PL/pgSQL i altres llenguatges procedimentals
