viernes, 26 de junio de 2026

🐘 Tipos de Datos en PostgreSQL

🧠 ¿Qué son los tipos de datos?

Un tipo de dato define qué tipo de información puede almacenarse en una columna de una tabla.

👉 Es una regla que garantiza que los datos tengan el formato correcto.

Ejemplo:

CREATE TABLE usuarios (

id INTEGER,

nombre VARCHAR(100),

activo BOOLEAN

);

  • INTEGER → solo números enteros

  • VARCHAR(100) → texto

  • BOOLEAN → verdadero/falso


📦 ¿Por qué son importantes?

Elegir correctamente los tipos de datos:

  • ✅ Mejora el rendimiento

  • ✅ Ahorra espacio

  • ✅ Evita errores

  • ✅ Facilita validaciones

👉 Un mal diseño puede afectar seriamente tu aplicación.


🔢 Tipos numéricos

🔹 Enteros

Tipo

Descripción

SMALLINT

Enteros pequeños

INTEGER

Enteros comunes

BIGINT

Enteros grandes

✅ Ejemplo:

CREATE TABLE productos (

id SERIAL PRIMARY KEY,

stock INTEGER

);


🔹 Decimales

Tipo

Uso

NUMERIC

Precisión exacta

DECIMAL

Similar a NUMERIC

REAL

Punto flotante

DOUBLE PRECISION

Mayor precisión flotante

✅ Ejemplo:

precio NUMERIC(10,2)

👉 Perfecto para dinero (evitar float).


🔤 Tipos de texto

Tipo

Descripción

CHAR(n)

Longitud fija

VARCHAR(n)

Longitud variable con límite

TEXT

Longitud ilimitada

✅ Ejemplo:

nombre VARCHAR(100),

descripcion TEXT

💡 Recomendación:

  • Usa TEXT en la mayoría de casos (PostgreSQL lo maneja muy bien)


📅 Tipos de fecha y tiempo

Tipo

Descripción

DATE

Fecha

TIME

Hora

TIMESTAMP

Fecha y hora

TIMESTAMPTZ

Fecha y hora con zona horaria

✅ Ejemplo:

created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP

👉 Muy usados para auditoría.


✅ Tipo booleano

activo BOOLEAN

Valores posibles:

  • TRUE

  • FALSE

  • NULL

✅ Ejemplo:

SELECT * FROM usuarios WHERE activo = TRUE;


🔑 Tipos auto-incrementales

PostgreSQL tiene formas modernas de generar IDs automáticamente.

🔹 SERIAL (clásico)

id SERIAL PRIMARY KEY


🔹 IDENTITY (recomendado moderno)

id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY

👉 Mejor práctica en versiones recientes.


🧩 Tipos JSON

PostgreSQL soporta datos tipo NoSQL:

Tipo

Descripción

JSON

Texto JSON

JSONB

JSON binario (más eficiente)

✅ Ejemplo:

config JSONB

Insert:

INSERT INTO settings (config)

VALUES ('{"tema": "oscuro", "idioma": "es"}');

👉 JSONB es el más usado.


📚 Arrays

PostgreSQL permite arrays directamente:

tags TEXT[]

✅ Ejemplo:

INSERT INTO posts (tags)

VALUES (ARRAY['postgres', 'sql', 'tutorial']);


🌍 UUID

Para identificadores únicos globales:

id UUID

✅ Ejemplo:

id UUID DEFAULT gen_random_uuid()

👉 Muy usado en microservicios.


📍 Tipos especiales interesantes

🔹 ENUM

Permite valores definidos:

CREATE TYPE estado AS ENUM ('pendiente', 'enviado', 'entregado');


CREATE TABLE pedidos (

id SERIAL,

estado estado

);


🔹 BYTEA

Para almacenar binarios:

archivo BYTEA


⚖️ ¿Cómo elegir el tipo adecuado?

✅ Reglas prácticas

  • Números → INTEGER o BIGINT

  • Dinero → NUMERIC(10,2)

  • Texto → TEXT o VARCHAR

  • Fechas → TIMESTAMP

  • JSON → JSONB

  • IDs → IDENTITY o UUID


🚫 Errores comunes

❌ Usar VARCHAR en todo

precio VARCHAR(50)  -- mala práctica

✅ Mejor:

precio NUMERIC(10,2)

``


❌ Usar FLOAT para dinero

Puede generar errores de precisión.


❌ Sobredimensionar campos

VARCHAR(1000) para nombre


🧪 Ejemplo completo

CREATE TABLE usuarios (

id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,

nombre VARCHAR(100),

email TEXT,

edad INTEGER,

activo BOOLEAN DEFAULT TRUE,

saldo NUMERIC(10,2),

preferencias JSONB,

creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP

);


💡 Buenas prácticas

  • Prefiere TEXT sobre VARCHAR cuando no necesitas límite

  • Usa NUMERIC para valores financieros

  • Usa TIMESTAMPTZ si trabajas con diferentes zonas horarias

  • Evita tipos innecesariamente grandes

  • Usa JSONB en lugar de JSON

  • Prefiere IDENTITY en lugar de SERIAL


✅ Conclusión

Los tipos de datos son la base de un buen diseño en PostgreSQL. Elegirlos correctamente no solo mejora el rendimiento, sino que también garantiza la integridad y escalabilidad de tu sistema.


🐘 Esquemas en PostgreSQL: qué son y cómo usarlos

🧠 ¿Qué es un esquema?

Un esquema (schema) en PostgreSQL es una forma de organizar y agrupar objetos dentro de una base de datos.

👉 Es como una carpeta dentro de una base de datos.

Dentro de un esquema puedes tener:

  • Tablas

  • Vistas

  • Funciones

  • Índices

  • Secuencias


🎯 Ejemplo conceptual

Imagina una base de datos llamada:

empresa_db


Dentro puedes tener esquemas como:

  • ventas

  • recursos_humanos

  • finanzas

Y dentro de cada esquema sus propias tablas:

empresa_db

  ├── ventas.clientes

  ├── ventas.pedidos

  ├── recursos_humanos.empleados

  ├── finanzas.facturas



📦 ¿Para qué se usan los esquemas?

Los esquemas sirven principalmente para:

1. 🗂️ Organizar objetos

Separar lógica y funcionalidad dentro de la misma base de datos.

Ejemplo:

  • Esquema auth → usuarios y permisos

  • Esquema app → lógica de la aplicación

  • Esquema reporting → reportes


2. 🔒 Controlar accesos

Puedes dar permisos por esquema en lugar de tabla por tabla.

GRANT USAGE ON SCHEMA ventas TO usuario_app;


3. 🚫 Evitar conflictos de nombres

Puedes tener tablas con el mismo nombre en distintos esquemas.

ventas.clientes

soporte.clientes


4. 🏗️ Soporte para múltiples aplicaciones

Una sola base de datos puede contener varios sistemas organizados por esquema.


🧩 Esquemas por defecto

Cuando creas una base de datos en PostgreSQL, ya existen esquemas:

🔹 public

  • Es el esquema por defecto

  • Si no especificas esquema, los objetos se crean aquí

CREATE TABLE clientes (...);

-- equivale a

CREATE TABLE public.clientes (...);


🔹 Otros esquemas internos

  • pg_catalog → funciones y metadatos internos

  • information_schema → vistas estándar del sistema


🛠️ Crear un esquema

🔹 Sintaxis básica

CREATE SCHEMA nombre_schema;

✅ Ejemplo:

CREATE SCHEMA ventas;


🔹 Crear con propietario

CREATE SCHEMA ventas AUTHORIZATION postgres;


🧱 Crear objetos dentro de un esquema

🔹 Crear una tabla en un esquema específico

CREATE TABLE ventas.clientes (

id SERIAL PRIMARY KEY,

nombre VARCHAR(100),

email VARCHAR(100)

);


🔹 Insertar datos

INSERT INTO ventas.clientes (nombre, email)

VALUES ('Juan Pérez', 'juan@email.com');


🔹 Consultar datos

SELECT * FROM ventas.clientes;


🔄 Cambiar el esquema por defecto (search_path)

PostgreSQL usa una variable llamada search_path que define en qué esquemas buscar.

🔹 Ver configuración

SHOW search_path;


🔹 Cambiar esquema por defecto

SET search_path TO ventas;

Ahora puedes hacer:

SELECT * FROM clientes;

(en lugar de ventas.clientes)


🗑️ Eliminar un esquema

DROP SCHEMA nombre_schema;

⚠️ Ejemplo:

DROP SCHEMA ventas;


🔹 Eliminar con todo su contenido

DROP SCHEMA ventas CASCADE;

🚨 Esto elimina:

  • Tablas

  • Vistas

  • Funciones


🔐 Permisos en esquemas

🔹 Dar acceso

GRANT USAGE ON SCHEMA ventas TO usuario_app;

``

🔹 Permitir crear objetos

GRANT CREATE ON SCHEMA ventas TO usuario_app;


⚖️ Esquemas vs Bases de Datos

Característica

Base de Datos

Esquema

Nivel

Alto

Intermedio

Contiene

Todo

Objetos específicos

Aislamiento

Total

Parcial

Conexión

Requiere reconexión

No

👉 Resumen:

  • Base de datos = contenedor principal

  • Esquema = organización interna


💡 Buenas prácticas

✅ 1. No usar solo public

Define esquemas propios para organizar mejor.


✅ 2. Nombres claros

ventas

auth

reportes


✅ 3. Separar por dominio

  • core → lógica principal

  • audit → auditoría

  • api → capa de exposición


✅ 4. Evitar mezclar todo

❌ Mala práctica:

public (todo aquí)


✅ Buena práctica:

app.usuarios

app.productos

audit.logs



✅ 5. Controlar permisos por esquema

Más simple y seguro que hacerlo por tabla.


🚀 Caso práctico simple

-- Crear esquema

CREATE SCHEMA ecommerce;


-- Crear tabla

CREATE TABLE ecommerce.productos (

id SERIAL PRIMARY KEY,

nombre VARCHAR(100),

precio NUMERIC(10,2)

);


-- Insertar datos

INSERT INTO ecommerce.productos (nombre, precio)

VALUES ('Laptop', 15000.00);


-- Consultar

SELECT * FROM ecommerce.productos;


✅ Conclusión

Los esquemas son una herramienta clave en PostgreSQL para:

  • Organizar la base de datos

  • Mejorar la seguridad

  • Escalar proyectos

  • Mantener orden en sistemas grandes

Si usas correctamente los esquemas desde el inicio, tu base de datos será mucho más mantenible y profesional.


🐘 Tipos de Datos en PostgreSQL