¿Cómo crear tipos de datos personalizados en bases de datos relacionales?
Crear tipos de datos personalizados es una poderosa herramienta que no todos los manejadores de bases de datos proporcionan. Este enfoque permite mayor control sobre los datos, limitando las entradas a ciertas opciones predefinidas. Aquí te enseñaré cómo definir tipos de datos en PostgreSQL, una habilidad que potenciará tus capacidades como desarrollador o administrador de bases de datos.
¿Qué son los tipos de datos personalizados?
Los tipos de datos personalizados permiten definir listas concretas de valores que se pueden almacenar en un campo específico de una tabla. En particular, los tipos de datos como enum ayudan a restringir las entradas a un conjunto definido, lo que evita errores como la entrada de datos no válidos.
¿Cómo se definen los tipos de datos en PostgreSQL?
Para crear un tipo de dato personalizado en PostgreSQL, usamos la sentencia CREATE TYPE. A continuación, te muestro un ejemplo práctico:
En este caso, el registro se insertará correctamente, ya que feliz es un valor permitido.
¿Cuándo es útil usar tipos de datos personalizados?
Estos tipos de datos son ideales cuando necesitas limitar las entradas a un conjunto específico de valores permitidos. Un ejemplo común es un sistema de clasificación de películas, donde la clasificación se limita a categorías estándar como G, PG, PG-13, etc., proporcionadas por asociaciones de clasificación de contenidos.
Los tipos de datos personalizados no solo mejoran la integridad de tus datos, sino que también facilitan el mantenimiento y actualización de tu sistema al minimizar los errores de entrada. Atrévete a experimentar con ellos en tus próximos proyectos para experimentar sus beneficios de primera mano.
postgreSQL cuenta con una funcionalidad muy poderosa, la cual es dejar que el usuario cree sus propios datos personalizados.
CREATETYPE humor ASENUM('triste','normal','feliz');CREATETABLE persona_prueba( nombre text, humor_actual humor
);#al tratar de incertar el tipo de dato molesto daria un error en el Query #esto devido a que ese valor no esta predefinido en nuestra creacion de datosINSERTINTO persona_prueba VALUES('Pablo','molesto');INSERTINTO persona_prueba VALUES('Pablo','feliz');SELECT*FROM persona_prueba;
Así es!
MUY incompleta la clase, como borrar TYPE, como Modificarlo, como reemplazarlo “CREATE OR REPLACE”.
Crear estos tipos de datos personalizados nos da muchas mas opciones mas que solo indicar si un dato debe ser entero, string, etc. Tambien tenemos la posibilidad de limitar las opciones de el registro, algo asi como una lista desplegable que solo nos deja seleccionar un solo dato, en el lenguaje SQL insertar valores espcificos de una lista de valores definidos al momento de crear nuestro tipo de dato.
En PostgreSQL, puedes definir tipos de datos personalizados para adaptar la base de datos a las necesidades específicas de tu aplicación. Los tipos de datos personalizados se crean mediante la declar
ación de tipos en el sistema, y pueden contener datos complejos y estructuras personalizadas.
--Crear un nuevo tipo de datos
CREATETYPE direccion AS( calle VARCHAR(255), ciudad VARCHAR(100), codigo_postal VARCHAR(10));--Crear una tabla que utiliza el nuevo tipo de datos
CREATETABLEusuarios( id SERIALPRIMARYKEY, nombre VARCHAR(50), direccion_usuario direccion
);--Insertar datos en la tabla
INSERTINTOusuarios(nombre, direccion_usuario)VALUES('Juan',ROW('Calle 123','Ciudad A','12345')),('Maria',ROW('Calle 456','Ciudad B','67890'));--Consultar datos
SELECT*FROM usuarios;
La utilidad es como una lista de validación de datos en excel,,,,
Es interesante la manera de crear tipos de datos y hacer una lista para seleccionar, la pregunta es: se puede utilizar la posición del dato en la lista? en vez de escribir la palabras de humor escribir el 0,1 o 2...?
Si,cuando uno crea una lista también puede acceder a su posición
En PostgreSQL, los tipos de datos personalizados son una poderosa característica que permite definir nuevos tipos de datos específicos para tus necesidades, lo que puede facilitar la modelización y el manejo de datos complejos. Aquí tienes una explicación detallada:
¿Qué son los tipos de datos personalizados?
Son tipos de datos definidos por el usuario que amplían las capacidades de PostgreSQL más allá de los tipos predefinidos (como INTEGER, TEXT, BOOLEAN, etc.). Puedes crear tipos para representar estructuras, conjuntos de valores finitos, o cualquier entidad específica de tu aplicación.
Tipos de datos personalizados más comunes
1. Tipos Enumerados (ENUM)
Se utilizan para representar un conjunto finito de valores.
Útil para datos como estados, categorías, niveles, etc.
Ejemplo:
CREATE TYPE nivel_educativo AS ENUM ('Primaria', 'Secundaria', 'Universidad', 'Maestría', 'Doctorado');
-- Usando el tipo ENUM en una tabla
CREATE TABLE estudiantes (
id SERIAL PRIMARY KEY,
nombre TEXT,
nivel nivel_educativo
);
2. Tipos Compuestos
Agrupan múltiples campos en un solo tipo, similar a una estructura o un objeto.
Útil para almacenar datos complejos en un solo campo.
Ejemplo:
CREATE TYPE direccion AS (
calle TEXT,
ciudad TEXT,
codigo_postal TEXT
);
-- Usando el tipo compuesto en una tabla
CREATE TABLE empleados (
id SERIAL PRIMARY KEY,
nombre TEXT,
domicilio direccion
);
-- Insertar datos
INSERT INTO empleados (nombre, domicilio)
VALUES ('Juan Pérez', ROW('Calle 123', 'Bogotá', '110111'));
Para acceder a los campos del tipo compuesto:
SELECT (domicilio).calle, (domicilio).ciudad FROM empleados;
3. Tipos Basados en Rangos
Representan un rango continuo de valores (como fechas, números, etc.).
PostgreSQL ya incluye tipos de rango predefinidos (int4range, numrange, tsrange, etc.), pero puedes definir los tuyos.
Ejemplo:
CREATE TYPE salario_range AS RANGE (
subtype = NUMERIC,
subtype_diff = float8mi
);
-- Usar el tipo de rango en una tabla
CREATE TABLE trabajos (
id SERIAL PRIMARY KEY,
titulo TEXT,
rango_salario salario_range
);
-- Insertar un rango
INSERT INTO trabajos (titulo, rango_salario)
VALUES ('Desarrollador', '[3000,6000]');
4. Tipos Basados en Tablas
Puedes definir tipos basados en la estructura de una tabla.
Útil para reutilizar la estructura de datos en procedimientos almacenados o funciones.
Ejemplo:
CREATE TABLE productos (
id SERIAL PRIMARY KEY,
nombre TEXT,
precio NUMERIC
);
CREATE TYPE producto_tipo AS TABLE (
id SERIAL,
nombre TEXT,
precio NUMERIC
);
5. Tipos Definidos en Extensiones
Algunas extensiones de PostgreSQL incluyen sus propios tipos de datos personalizados, como:
hstore para pares clave-valor.
jsonb para datos JSON.
citext para texto insensible a mayúsculas.
Ventajas de los Tipos de Datos Personalizados
Claridad: Hacen que el modelo de datos sea más expresivo y fácil de entender.
Reutilización: Facilitan la reutilización de estructuras de datos en múltiples tablas y funciones.
Validación de Datos: Restringen los valores permitidos en un campo.
Optimización: Reducen la redundancia y errores en la definición de esquemas.
¿Cuándo usarlos?
Cuando necesitas modelar datos específicos o estructurados que no encajan bien en los tipos predefinidos.
Para garantizar consistencia en los datos a través de tu esquema.
En sistemas que trabajan con datos jerárquicos, categóricos o complejos.
👉Si te paso como a mi, que no lograba crear la tabla como queria
Primero tienes que borrar la tabla, ya que se quedo guardada en la Base de Datos que descargaste. Eso se hace con
DROPTABLE persona_prueba
Luego de eso, puedes crear y manipular la tabla tal y como te enseñan en la clase
Muy valioso este nuevo tipo y como usarlo para validar
Que rapidez de crear un tipo de dato. Si bien no es típico es un gran advantage de Postgress
Siempre es un placer tomar un buen curso de bases de datos, con un profesor muy agradable,
Muy interesante
Los tipos de datos ENUM en PostgreSQL se definen como tipos de datos personalizados. Se almacenan en el sistema de catalogación de PostgreSQL, específicamente en la tabla pg_enum, que guarda los valores permitidos por cada tipo ENUM. Al crear un tipo ENUM, estos valores son accesibles a través de la definición del tipo en la base de datos.
Esto permite que los usuarios solo puedan ingresar valores predefinidos, lo que mejora la integridad de los datos.
Me encantó esta función, porque la puedo usar para categorizar si un auto esta vendido, disponible o apartado, o demás, o que un empleado esta activo o en qué áreas perteneces, pero me surgió una duda. Si esto ya está creado, ¿Cómo es que alguien más puede saber que opciones tiene la lista?
Es decir, yo la creo, y yo sé que valores tiene dentro de la lista ENUM, pero si alguien más viene y tiene que insertar datos y le salta error y por más que intenta insertar de una forma u otra incluyendo ortografía, cómo puede saber él sin necesidasd de mi presencia qué valores son aceptados?
que ventaja tengo en usar este tipo de dato vs un constraint ?
Para mi creo,que una ventaja seria que es mas fácil de crear, pero prácticamente no tienen muchas diferencias ya que este tipo de restricciones les dan tanto control sobre los datos en sus tablas como uno desee.
no sería mas sencillo una tabla y usar un FK?
Lo que no me quedo claro, es cuando usarlo y cuando no. Es decir, ¿cuál es el beneficio de hacer una tabla en lugar de una lista?