- Aprender
- Informática
- Programación
- Fundamentos de SQL
- Modelo relacional
El modelo relacional
PrincipianteUnidad 1 de 6 del curso Curso de Fundamentos de SQL
Lo que aprenderás
- Describe por qué las organizaciones guardan datos compartidos en bases de datos relacionales, qué hace un sistema de gestión de bases de datos y cómo se utiliza SQL para trabajar con él.
- Explica por qué las organizaciones utilizan bases de datosDistingue entre datos, una base de datos y un sistema de gestión de bases de datos, y explica qué hace mejor una base de datos relacional que una hoja de cálculo compartida o unos archivos sueltos.
- Reconoce los sistemas de bases de datos y la función de SQLNombra sistemas de bases de datos relacionales habituales, describe cómo se conectan las aplicaciones a ellos y explica qué es SQL y cómo se agrupan sus sentencias.
- Explica por qué las organizaciones utilizan bases de datos
- Utiliza el vocabulario de tablas, filas y columnas para leer los datos correctamente y explica las reglas que hacen que una tabla sea relacional.
- Describe las partes de una tablaIdentifica tablas, filas, columnas y valores en datos de ejemplo, y relaciona las palabras cotidianas con sus nombres relacionales formales.
- Explica las reglas que hacen que una tabla sea relacionalAplica las reglas del modelo relacional sobre filas, columnas y valores, y reconoce en qué aspectos se comportan de forma diferente las tablas SQL y las hojas de cálculo.
- Describe las partes de una tabla
- Asigna a cada columna un tipo de datos adecuado, evita los errores habituales de tipos con dinero, códigos y fechas, y trabaja correctamente con NULL.
- Reconoce los principales tipos de datos de SQLIdentifica los tipos numéricos, de texto, de fecha y booleanos habituales, interpreta sus ajustes de tamaño y precisión, y conoce las diferencias entre sistemas de bases de datos.
- Elige un tipo de datos para datos del mundo realElige tipos adecuados para dinero, cantidades, códigos, fechas y nombres según cómo se utilizarán los valores, y evita los errores que causan los tipos inadecuados.
- Trabaja correctamente con NULLExplica qué significa NULL, distínguelo de cero y de la cadena vacía, y predice cómo se comporta en comparaciones, cálculos y restricciones.
- Reconoce los principales tipos de datos de SQL
- Utiliza claves primarias para identificar cada fila y claves foráneas para vincular tablas, y reconoce las relaciones uno a muchos, uno a uno y muchos a muchos que crean.
- Identifica las claves candidatas y la clave primariaDetermina qué columnas o combinaciones de columnas identifican cada fila de forma única y explica las reglas que debe cumplir una clave primaria.
- Elige entre claves naturales y sustitutasCompara identificadores del mundo real con otros generados por el sistema, evalúa cuáles son buenas claves primarias y protege los identificadores naturales con restricciones de unicidad.
- Vincula tablas mediante claves foráneasExplica cómo una clave foránea hace referencia a una fila de otra tabla, qué protege la integridad referencial y qué ocurre cuando las filas referenciadas cambian o se eliminan.
- Reconoce las relaciones uno a muchos, uno a uno y muchos a muchosDetermina cuántas filas de cada lado de un vínculo pueden relacionarse y muestra cómo las claves foráneas y las tablas intermedias representan cada tipo de relación.
- Identifica las claves candidatas y la clave primaria
- Lee un esquema escrito como definiciones de tablas o representado en un diagrama, y utilízalo con datos de ejemplo para localizar dónde se almacenan los datos y cómo se conectan las tablas.
- Lee un esquema y sus definiciones de tablasDistingue un esquema de los datos que describe, lee la notación de esquemas y las sentencias CREATE TABLE, e interpreta las restricciones que declaran.
- Lee un diagrama del esquemaInterpreta los recuadros, las marcas de claves, las líneas de conexión y los símbolos de pata de cuervo de un diagrama del esquema, y expresa con palabras cada relación que muestra.
- Responde preguntas utilizando un esquema y datos de ejemploLocaliza dónde se almacena cada dato, sigue manualmente las claves entre tablas y utiliza las restricciones del esquema para decidir qué datos se permiten.
- Lee un esquema y sus definiciones de tablas
Guía de estudio de Modelo relacional
1Qué hace una base de datos
Una tienda puede empezar con una hoja de cálculo, pero los datos compartidos pronto plantean preguntas más difíciles: ¿qué datos de los clientes están actualizados, quién puede modificarlos y qué ocurre si un pago se interrumpe a mitad del proceso? Un sistema de bases de datos ofrece un marco común para responderlas. Distingue los datos almacenados del software que los gestiona y descubre cómo las aplicaciones utilizan SQL para solicitar datos y realizar cambios. Las mismas ideas sirven para una pequeña aplicación de teléfono y para el sistema de informes de una gran empresa.
1.1 Datos compartidos y cambios fiables
El nombre de un cliente, la fecha de un pedido y un precio son datos: hechos registrados. Una base de datos es una colección organizada de datos relacionados. Un sistema de gestión de bases de datos, o SGBD, es el software que almacena y gestiona esa colección. PostgreSQL es un SGBD; la base de datos store de una tienda es una de las colecciones que gestiona.
Almacena cada dato donde corresponde
Supón que una hoja de cálculo repite el teléfono de Maria Garcia en sus 14 ventas. Cambiar el teléfono requiere 14 modificaciones. Una celda olvidada deja registros contradictorios. En una base de datos relacional, customers contiene los datos de Maria una sola vez, con customer_id 1. Cada venta registra ese identificador. Actualizar su teléfono en una fila de cliente permite obtener un único número actualizado en las búsquedas posteriores.
Una base de datos relacional organiza los datos en tablas. «Relacional» procede de relación, el nombre matemático de una tabla. E. F. Codd presentó el modelo en 1970. Su separación central resulta útil: los usuarios describen los datos que quieren mediante tablas y valores; el SGBD se encarga de cómo encontrarlos en el disco.
Reglas y acceso compartido
Una tabla tiene columnas con nombre, tipos de datos y restricciones. Una restricción es una regla que comprueba el SGBD, como «un pedido debe hacer referencia a un cliente existente». Estas comprobaciones protegen los datos compartidos cuando varias aplicaciones utilizan la misma base de datos. La aplicación de los tipos varía: PostgreSQL rechaza texto como 'twelve' en una columna numérica de precios, mientras que las tablas ordinarias de SQLite tienen tipos flexibles.
Un SGBD también gestiona usuarios simultáneos, permisos, copias de seguridad y recuperación. Dos empleados pueden trabajar con datos compartidos sin intercambiar copias independientes de una hoja de cálculo. Los permisos pueden permitir que un usuario de informes lea las ventas y limitar quién puede modificarlas. Un proceso de copia de seguridad y recuperación ayuda a restaurar los datos tras un fallo.
Mantén unido un grupo de cambios
Una transacción trata varios cambios como una unidad: se guardan todos o no se guarda ninguno. Transferir 200 u.m. entre cuentas requiere restarlas de la cuenta corriente y sumarlas a la de ahorro. Si un fallo interrumpe la transferencia antes de completarse, el SGBD puede deshacer la transacción incompleta. Guardar solo la resta dejaría un saldo incorrecto.
Una hoja de cálculo sigue siendo útil para cálculos pequeños y diseños flexibles. Una base de datos proporciona una estructura definida para registros compartidos y reglas. Una hoja de Excel tiene un límite fijo de 1 048 576 filas; las bases de datos suelen gestionar colecciones mucho mayores, sujetas a los límites de almacenamiento, hardware y producto.
Datos diferentes y trabajos diferentes
Los datos estructurados encajan en columnas con nombre compartidas por todas las filas. Los datos semiestructurados, como los documentos JSON, pueden tener campos diferentes en distintos registros. Los datos no estructurados, como el audio o el correo electrónico de formato libre, carecen de esa estructura tabular fija. Las organizaciones suelen combinar bases de datos relacionales con almacenes de documentos, de clave-valor o de archivos.
La carga de trabajo también importa. Un sistema transaccional, también llamado OLTP, registra sucesos cotidianos mediante muchas lecturas y escrituras pequeñas: un pedido, un pago, un cambio de dirección. Un sistema analítico, u OLAP, lee muchos registros almacenados para responder preguntas como «¿Cómo variaron las ventas mensuales por región?». Ambos pueden utilizar tablas y claves relacionales.
Puntos clave
- Una base de datos contiene datos relacionados; un SGBD los gestiona.
- Los datos relacionales se organizan en tablas, con reglas que comprueba el SGBD.
- Una transacción guarda o deshace conjuntamente un grupo de cambios.
- Los datos compartidos de los clientes pueden actualizarse en un solo lugar y localizarse mediante un identificador.
- El trabajo transaccional registra sucesos; el analítico resume datos almacenados.
1.2 SQL, productos de bases de datos y aplicaciones
SQL, cuyas siglas corresponden a lenguaje de consulta estructurada, es un lenguaje. PostgreSQL, MySQL, SQLite, Microsoft SQL Server y Oracle Database son productos que lo utilizan. SQL Server es un SGBD, no otro nombre del propio SQL.
Cómo accede una aplicación a los datos
En un sistema cliente-servidor, un programa servidor gestiona la base de datos. Un cliente, como un sitio web, una herramienta de informes o un editor de consultas, envía solicitudes a ese servidor. PostgreSQL, MySQL, SQL Server y Oracle suelen funcionar así. Herramientas como psql, pgAdmin, DBeaver y SQL Server Management Studio permiten inspeccionar bases de datos y enviar solicitudes.
Un motor integrado se ejecuta dentro de una aplicación. SQLite utiliza una biblioteca y un archivo ordinario de base de datos, como store.db, sin un servidor de bases de datos independiente. Es habitual en teléfonos, navegadores y aplicaciones de escritorio. Un servicio gestionado en la nube, como Azure SQL Database, Amazon RDS o Google Cloud SQL, permite que un proveedor se encargue de los servidores de bases de datos. «Gestionado» describe quién opera el servicio; no sustituye las tablas y las claves por un modelo diferente.
Una instalación de un SGBD puede gestionar varias bases de datos, como store y payroll. Una conexión selecciona la base de datos que se utilizará, según los permisos.
Indica qué resultado quieres
SQL es declarativo: describe el resultado requerido y el SGBD elige cómo obtenerlo. Lee esta sentencia:
SELECT first_name, city
FROM customers
WHERE state = 'TX';
Solicita los nombres y las ciudades de las filas de clientes cuyo estado es TX. No indica qué página del disco leer primero. Las palabras clave en mayúsculas facilitan la lectura de la sentencia; select y SELECT significan lo mismo. Un punto y coma suele finalizar una sentencia.
Reconoce la función de la sentencia
| Grupo | Finalidad | Ejemplos |
|---|---|---|
| Definición de datos, DDL | Definir o modificar la estructura | CREATE TABLE, ALTER TABLE, DROP TABLE |
| Manipulación de datos, DML | Leer o modificar filas | SELECT, INSERT, UPDATE, DELETE |
| Control de datos, DCL | Gestionar permisos | GRANT, REVOKE |
| Control de transacciones | Guardar o deshacer una transacción | COMMIT, ROLLBACK |
Algunos libros sitúan SELECT en un grupo independiente de lenguaje de consulta de datos. La distinción útil es la función real de la sentencia: añadir una columna cambia la estructura; añadir un cliente cambia los datos.
SQL se convirtió en un estándar ANSI en 1986 y está estandarizado internacionalmente como ISO/IEC 9075. Los productos añaden sus propios dialectos. Un límite de diez filas se expresa como LIMIT 10 en SQLite, PostgreSQL y MySQL, TOP 10 en SQL Server o FETCH FIRST 10 ROWS ONLY en SQL estándar y Oracle.
Lee texto y otros objetos de base de datos
Los literales de texto utilizan comillas simples: 'TX'. SQL estándar utiliza comillas dobles para los identificadores, como los nombres de columnas. Un apóstrofo dentro del texto se duplica: 'O''Brien' representa O'Brien.
Una vista es una consulta guardada que se utiliza como una tabla; una vista ordinaria no tiene filas propias almacenadas. Un índice es una estructura de búsqueda que puede ayudar a encontrar filas rápidamente. La mayoría de los sistemas crea índices de claves primarias automáticamente. Los procedimientos almacenados y las funciones son código guardado que puede ejecutarse por su nombre.
Puntos clave
- SQL describe el resultado deseado; el SGBD elige cómo obtenerlo.
- Los sistemas cliente-servidor aceptan solicitudes a través de un servidor; SQLite está integrado en una aplicación.
- DDL modifica la estructura, mientras que DML lee o modifica filas.
- Las comillas simples delimitan texto; un apóstrofo dentro del texto se duplica.
- Una vista guarda una consulta; un índice permite búsquedas más rápidas.
- Los dialectos SQL comparten las ideas relacionales, pero difieren en algunos aspectos de la sintaxis.
2Lee una tabla correctamente
Una tabla da una estructura clara a cada tipo de registro: las filas describen elementos individuales y las columnas describen sus propiedades. Lee la estructura antes de interpretar un valor. Después, distingue las reglas lógicas de la tabla de la disposición de una hoja de cálculo: la posición no identifica un registro, una lista de teléfonos contiene más de un valor y una fila de total tiene un significado distinto al de una venta. Estas distinciones facilitan mucho el trabajo posterior con claves y esquemas.
2.1 Filas, columnas y valores
Una tabla almacena datos sobre un tipo de cosa. Cada fila de customers describe un cliente; cada columna contiene una propiedad. Su intersección contiene un valor.
Lee un registro de lado a lado
Estas son algunas columnas de clientes:
customer_id | first_name | last_name | ciudad | estado | zip_code |
|---|---|---|---|---|---|
| 1 | Maria | Garcia | Austin | TX | 78701 |
| 2 | James | Wilson | Denver | CO | 80202 |
| 3 | Aisha | Johnson | Boston | MA | 02108 |
| 4 | Wei | Chen | Seattle | WA | 98101 |
Busca customer_id 4 y lee city: la ciudad de Wei es Seattle. Para saber quién vive en Denver, lee el nombre en la fila de Denver: James Wilson. Una fila contigua describe a otro cliente.
La tabla completa tiene ocho columnas: customer_id, first_name, last_name, email, phone, city, state y zip_code. El teléfono de James es NULL: falta el valor, pero su fila sigue teniendo la columna de teléfono.
Relaciona el vocabulario
| Palabra cotidiana | Término relacional formal | Otra palabra habitual |
|---|---|---|
| Tabla | Relación | – |
| Fila | Tupla | Registro |
| Columna | Atributo | Campo |
Una tupla es una fila completa, no una celda. Un atributo nombra una propiedad compartida por todas las filas. «Registro 4» podría referirse a un identificador o a una posición en pantalla; comprueba a cuál, porque las posiciones pueden cambiar.
Cuenta las dimensiones
El grado cuenta las columnas; la cardinalidad de una tabla cuenta las filas. La tabla completa tiene grado 8 y cardinalidad 4. La representación anterior muestra seis columnas sin cambiar el grado de la tabla.
Añadir un cliente aumenta la cardinalidad a 5; el grado sigue siendo 8. Añadir birth_date aumenta el grado a 9 y da a cada fila un lugar para ese valor, incluso cuando falta. Un cliente nuevo añade una fila, no una columna.
La cardinalidad de una relación, como uno a muchos, describe los vínculos permitidos, no el número de filas de una tabla.
Lee nombres cualificados
Los nombres de columna son únicos dentro de una tabla. orders.customer_id y customers.customer_id distinguen columnas con el mismo nombre en tablas diferentes: el punto separa los nombres de la tabla y de la columna.
snake_case utiliza palabras en minúsculas separadas por guiones bajos, como en zip_code. Los nombres con espacios necesitan comillas en SQL. Los nombres de tabla pueden funcionar en singular o en plural; utiliza una convención coherente.
Puntos clave
- Una fila describe un elemento; una columna describe una propiedad.
- Relación, tupla y atributo significan tabla, fila y columna.
- El grado cuenta columnas; la cardinalidad de una tabla cuenta filas.
- Un nombre cualificado con la tabla identifica a qué tabla pertenece una columna.
2.2 Las reglas de la cuadrícula
Una tabla relacional tiene una estructura lógica que va más allá de su aspecto rectangular. En el modelo formal es un conjunto de filas. Los conjuntos no contienen elementos duplicados ni tienen orden. Las columnas se identifican por su nombre, por lo que mover una columna en una representación no cambia el dato que representa.
La identidad no depende de la posición
Un SGBD puede devolver las filas en un orden diferente tras actualizaciones, eliminaciones o un cambio en la forma de leer el almacenamiento. «La tercera fila» no es una forma duradera de identificar a un cliente. customer_id 3 sigue identificando a Aisha aunque su fila aparezca primero. Una consulta que necesita un orden concreto lo solicita con ORDER BY.
Las tablas SQL difieren de las relaciones formales: sin una clave primaria u otra restricción de unicidad adecuada, pueden contener filas idénticas. Dos copias de ('Coffee mug', 12.50) no ofrecen ningún valor que las distinga en esas columnas. Una clave primaria da a cada fila un identificador único e impide las filas completamente duplicadas.
Una columna, un dominio
Un dominio es el conjunto de valores permitidos en una columna. Una cantidad tiene un tipo entero y también puede necesitar una regla que exija que sea positiva. Un código estatal es texto, pero no cualquier texto es un código estatal válido. Los tipos de datos y las restricciones describen al SGBD los valores permitidos.
Todas las filas comparten las mismas columnas. Un pedido no puede adquirir una columna adicional de nota para regalo solo para él. La tabla puede tener una columna gift_note para todos los pedidos, con NULL donde no se haya registrado ninguna nota. Los datos opcionales también tienen un lugar definido.
Mantén separados los valores individuales
Un valor atómico es un único valor para la finalidad de la columna. Una celda de teléfono que contiene «512-555-0147, 512-555-0199» contiene una lista de dos números. Encontrar, comprobar o eliminar solo uno resulta complicado. Una tabla customer_phones puede dar a cada teléfono su propia fila, con customer_id para indicar a quién pertenece.
Atómico no significa que todos los valores de texto deban dividirse en sus partes más pequeñas. El nombre de una ciudad puede contener varias palabras y seguir siendo un único valor de ciudad. La cuestión es si la celda almacena un dato del tipo que representa la columna o una colección que debería gestionarse por separado.
Lee con criterio una exportación de una hoja de cálculo
Una hoja de ventas puede incluir un encabezado repetido a mitad de la hoja, una fila al final llamada «TOTAL» y un precio escrito como «12,50 (oferta)». Son opciones de presentación útiles para una persona, pero mezclan distintos tipos de contenido en las mismas columnas.
Para leerla como una tabla relacional:
- Trata los nombres de las columnas como encabezado, no como registros de ventas.
- Mantén cada fila de datos dedicada a una venta; calcula el total a partir de esas filas.
- Almacena el precio numérico separado de una nota de oferta.
- Da a cada venta una clave para poder identificar su fila.
Una fila de total mezclada con las ventas podría contarse como otra venta o sumarse de nuevo al total. Una nota mezclada con un precio numérico impide realizar operaciones numéricas ordinarias.
Tablas lógicas y almacenamiento físico
Una tabla es la representación lógica del usuario. El SGBD puede almacenar sus datos en archivos, páginas e índices organizados para un acceso eficiente. La independencia de los datos significa que los cambios en esa organización física no tienen por qué cambiar los nombres de las tablas, los significados de las columnas ni las solicitudes que utilizan las aplicaciones.
Puntos clave
- Una relación formal tiene filas distintas y sin orden; SQL necesita restricciones para evitar duplicados.
- El orden de las filas debe solicitarse con
ORDER BY. - El dominio de una columna describe sus valores permitidos.
- Cada celda contiene un único valor para la finalidad de su columna.
- Todas las filas tienen las mismas columnas, incluidos los lugares para valores ausentes.
3Elige tipos e interpreta los datos ausentes
El tipo de una columna afecta a qué puede almacenarse, cómo se ordenan los valores y qué cálculos tienen sentido. Los dígitos pueden describir un recuento o un código; esos usos requieren tipos diferentes. El dinero necesita almacenamiento exacto, mientras que las mediciones a menudo pueden utilizar valores aproximados. Los datos ausentes necesitan su propio tratamiento como NULL. Aprende a tomar estas decisiones junto con las diferencias importantes entre productos, especialmente el almacenamiento flexible de SQLite y el tratamiento de las comparaciones desconocidas en SQL.
3.1 Los principales tipos de datos de SQL
Un tipo de datos indica al SGBD qué clase de valor contiene una columna y cómo trabajar con él. La suma numérica, la comparación de texto y la ordenación de fechas son operaciones diferentes. Un nombre de tipo conocido también puede comportarse de forma distinta entre productos de bases de datos.
Números: enteros, exactos y aproximados
| Clase | Tipos habituales | Uso adecuado |
|---|---|---|
| Números enteros | INTEGER, SMALLINT, BIGINT | Recuentos, cantidades e identificadores enteros |
| Decimales exactos | DECIMAL(p, s), NUMERIC(p, s) | Dinero y otros importes decimales exactos |
| Números aproximados | REAL, FLOAT, DOUBLE PRECISION | Mediciones que admiten diferencias por redondeo |
En PostgreSQL, MySQL y SQL Server, INTEGER abarca de −2 147 483 648 a 2 147 483 647. BIGINT alcanza 9 223 372 036 854 775 807; el almacenamiento de enteros de SQLite también puede alcanzar ese intervalo.
Para los decimales, la precisión es el número total de dígitos y la escala es el número de dígitos después de la coma decimal. DECIMAL(8, 2) deja seis dígitos antes de la coma: su máximo es 999 999,99. El precio 12,50 cabe; 1 234 567,00 no. PostgreSQL, MySQL, SQL Server y Oracle ofrecen almacenamiento decimal exacto. SQLite acepta esta declaración, pero no exige su precisión ni escala, y puede almacenar fracciones como números binarios de coma flotante.
La coma flotante aproxima muchas fracciones decimales. En doble precisión, sumar 0,1 y 0,2 da 0,30000000000000004. SQLite trata estos literales decimales como números de coma flotante. PostgreSQL trata los literales decimales sin tipo explícito como números exactos, por lo que el mismo cálculo escrito allí puede ser exacto; los valores explícitos de doble precisión muestran la aproximación.
Texto, fechas e indicadores
CHAR(n) es texto de longitud fija; PostgreSQL y SQL Server rellenan los valores más cortos con espacios. VARCHAR(n) permite longitudes variables hasta un límite. SQLite ignora ambos ajustes de longitud y no añade relleno. TEXT contiene texto largo en SQLite, PostgreSQL y MySQL. SQL Server utiliza VARCHAR(MAX) o NVARCHAR(MAX) para este fin; su antiguo tipo TEXT está obsoleto.
Un DATE contiene una fecha del calendario, un TIME una hora del día y el TIMESTAMP de SQL estándar una fecha y hora. Escribe las fechas en formato año-mes-día, como '2026-03-02', para evitar confundir el 2 de marzo con el 3 de febrero. Las fechas con tipo de fecha tienen un formato interno de almacenamiento; la aplicación elige cómo mostrarlas. SQLite no tiene un tipo específico de fecha y suele almacenarlas como texto ISO. SQL Server utiliza DATETIME2 para fecha y hora: su TIMESTAMP significa ROWVERSION, un contador binario de versiones.
Un BOOLEAN representa TRUE o FALSE, o NULL cuando falta el valor. PostgreSQL tiene un tipo booleano; SQL Server utiliza BIT, MySQL trata BOOLEAN como un entero pequeño y SQLite almacena los indicadores como 1 y 0. Los tipos binarios como BLOB o BYTEA de PostgreSQL almacenan bytes, incluidas imágenes pequeñas. Los archivos más grandes suelen almacenarse por separado, con una ruta o URL en una tabla.
La afinidad de tipo de SQLite
En las tablas ordinarias de SQLite, un tipo declarado es una preferencia llamada afinidad de tipo. Una columna INTEGER convierte '42' en el número 42, pero puede conservar 'abc' como texto. Una tabla STRICT de SQLite rechaza el texto que no puede convertirse en un entero válido.
Puntos clave
- Los enteros contienen números enteros; los decimales exactos y la coma flotante cubren necesidades diferentes.
- La precisión cuenta todos los dígitos; la escala cuenta los dígitos decimales.
- Las fechas en texto ISO siguen el orden año-mes-día.
- Las longitudes de texto, el almacenamiento booleano y los tipos de fecha presentan diferencias entre dialectos.
- La afinidad de SQLite es flexible; las tablas
STRICThacen cumplir los tipos que admiten. - El
TIMESTAMPde SQL Server es una versión de fila, no una fecha y hora.
3.2 Elige un tipo según la función del valor
Empieza por el significado de un valor y cómo se utilizará. Un código postal ZIP contiene dígitos, pero nadie suma códigos ZIP para obtener un total con sentido. Una cantidad también contiene dígitos, y sumar cantidades resulta útil. La apariencia por sí sola orienta poco al elegir un tipo.
Haz cinco preguntas
- ¿Cuáles son los valores habituales y qué valores extremos deben caber?
- ¿Se utilizarán los valores en operaciones aritméticas?
- ¿Deben ser exactos o se acepta una aproximación?
- ¿Cómo deben ordenarse y compararse?
- ¿Qué tamaño admite valores futuros realistas?
Dinero y mediciones
El dinero necesita valores exactos. En PostgreSQL, MySQL y SQL Server, un precio puede utilizar DECIMAL(8, 2). Tres artículos a 12,50 u.m. cuestan exactamente 37,50 u.m. El almacenamiento binario de coma flotante puede dejar errores mínimos tras sumas repetidas, lo que resta fiabilidad a las comparaciones exactas. En SQLite, declarar DECIMAL no proporciona almacenamiento decimal exacto; utiliza céntimos expresados como enteros para los importes exactos, de modo que 12,50 u.m. se almacene como 1250.
Una medición como el peso puede utilizar REAL cuando se aceptan pequeñas diferencias por redondeo. Elige la unidad como parte del significado de la columna: weight_lb indica las libras en su nombre. Un tipo numérico por sí solo no registra esa unidad.
La moneda también debe quedar definida. Si una tabla mezcla monedas, añade currency_code, como USD, EUR o JPY. Los decimales varían según la moneda, y los importes en distintas monedas deben convertirse antes de sumarlos.
Los códigos y los nombres son texto
Utiliza texto para códigos ZIP, teléfonos, números de cuenta y códigos de inventario. El código ZIP de Boston '02108' pierde su cero inicial al convertirse en entero. VARCHAR(10) también puede contener ZIP+4, como '02108-1234'. Los teléfonos pueden contener un signo más, espacios y guiones. Estos caracteres forman parte de la representación de un identificador, no son signos aritméticos.
Deja espacio para nombres y direcciones reales. «Christopher Montgomery» tiene 22 caracteres, por lo que VARCHAR(10) es demasiado corto. PostgreSQL y SQL Server lo rechazan; MySQL lo rechaza en modo estricto y puede truncarlo en otros modos. SQLite lo almacena porque ignora las longitudes de texto declaradas. Un campo de longitud variable con un límite amplio evita rechazar nombres habituales sin reservar su longitud máxima para cada fila.
La ordenación revela una elección incorrecta
La ordenación de texto compara caracteres. Los números almacenados como texto pueden aparecer en el orden '1', '10', '2', '25', '3'. Una columna numérica ordena esos valores numéricamente. Elegir texto para todos los campos traslada las comprobaciones y conversiones a los cálculos posteriores.
Las fechas tienen un problema parecido. El texto de fechas en formato estadounidense coloca '12/01/2025' después de '03/02/2026' en orden textual, aunque diciembre de 2025 es anterior. Utiliza un tipo de fecha, o texto ISO con formato uniforme en SQLite, para conservar el orden del calendario.
Lee juntos los tipos de un producto
Un producto puede utilizar product_id INTEGER, sku VARCHAR(20), name VARCHAR(100), price DECIMAL(8, 2), weight_lb REAL, in_stock BOOLEAN y added_on DATE. Cada tipo responde a una función: identificación, almacenamiento de códigos, un nombre, dinero exacto, medición, un indicador o una fecha. En SQLite, almacena el precio como céntimos expresados como enteros y la fecha como texto ISO.
Puntos clave
- Elige los tipos según el significado, la aritmética, la exactitud, la ordenación y un tamaño realista.
- Almacena los códigos como texto para conservar los ceros iniciales y los signos de puntuación.
- Utiliza decimales exactos para el dinero cuando se admitan, y céntimos expresados como enteros en SQLite.
- Un importe numérico necesita una moneda y una medición necesita una unidad.
- El almacenamiento como texto produce una ordenación textual, incluso cuando todos los caracteres son dígitos.
3.3 NULL y los resultados desconocidos
NULL indica un valor ausente. Es diferente de cero, de la cadena vacía '' y del texto 'NULL'. Un descuento conocido de 0 significa que no hay descuento; un descuento NULL significa que el importe no está registrado. Una columna que admite NULL permite datos ausentes, mientras que NOT NULL exige un valor.
La ausencia tiene más de un significado
James Wilson no tiene un teléfono registrado. El pedido 102 no tiene fecha de envío porque aún no se ha enviado. Un cliente que es una empresa puede no tener un apellido que corresponda registrar. Todos estos casos pueden representarse con NULL, pero NULL no registra qué motivo se aplica. Un diccionario de datos debe indicar el significado de cada columna.
La cadena vacía es un valor de texto presente en PostgreSQL y SQLite. Actualmente, Oracle trata la cadena vacía como NULL. Las herramientas de consultas pueden mostrar ambos como una celda que parece vacía, por lo que su apariencia no basta para distinguirlos.
Las comparaciones pueden ser desconocidas
Las comparaciones SQL tienen tres resultados posibles: TRUE, FALSE y UNKNOWN. Una comparación en la que interviene NULL, incluida NULL = NULL, es UNKNOWN. No se sabe si dos datos ausentes tienen el mismo valor.
Una cláusula WHERE solo conserva los resultados TRUE. Lee estas condiciones:
phone IS NULLencuentra los teléfonos ausentes.phone IS NOT NULLencuentra los teléfonos registrados.phone = NULLda UNKNOWN y no encuentra ninguna fila.
Negar una comparación no recupera un valor ausente. Añade a Daniel Brown, cuyo estado es NULL, a los cuatro clientes de la tienda. La condición state <> 'TX' conserva CO, MA y WA: tres filas. Daniel queda excluido porque la comparación de su estado es UNKNOWN. Para incluir también los estados ausentes, la condición es state <> 'TX' OR state IS NULL.
Combina las condiciones con cuidado
Piensa en UNKNOWN como «podría ser TRUE o FALSE». Un resultado solo queda determinado si ambas posibilidades dan el mismo resultado.
| Expresión | Resultado | Motivo |
|---|---|---|
| TRUE AND UNKNOWN | UNKNOWN | La segunda parte determina si ambas son verdaderas. |
| FALSE AND UNKNOWN | FALSE | Una parte falsa ya basta para que AND sea falso. |
| TRUE OR UNKNOWN | TRUE | Una parte verdadera ya basta para que OR sea verdadero. |
| FALSE OR UNKNOWN | UNKNOWN | La segunda parte determina el resultado de OR. |
| NOT UNKNOWN | UNKNOWN | La negación no puede aportar el dato ausente. |
Cálculos y resúmenes
La aritmética ordinaria con NULL da NULL: 5 + NULL es NULL. Un precio de línea multiplicado por una cantidad ausente también es ausente, no cero. Concatenar texto con || y NULL da NULL en PostgreSQL y SQLite; la concatenación de Oracle trata NULL como una cadena vacía.
Las funciones de agregación suelen omitir las entradas NULL. Con cinco clientes, incluidos James y Daniel sin teléfono, COUNT(*) cuenta las cinco filas. COUNT(phone) cuenta los tres teléfonos registrados. El promedio de 4, NULL y 2 es 3, porque la suma de los dos números conocidos se divide entre dos; tratar NULL como cero daría incorrectamente 2.
Utiliza NOT NULL para los datos que deben estar presentes, como una fecha de pedido. No exige un número positivo ni texto no vacío: esas son reglas independientes. Las claves primarias exigen una identidad distinta de NULL; las tablas ordinarias de SQLite tienen una excepción histórica para algunas declaraciones de clave primaria, por lo que declarar NOT NULL explícitamente es importante en ellas.
Puntos clave
- NULL indica información ausente; 0 y la cadena vacía tienen significados diferentes.
- Comprueba los valores ausentes con
IS NULLoIS NOT NULL. - Las comparaciones con NULL producen UNKNOWN;
WHEREsolo conserva TRUE. - AND, OR y NOT deben tener en cuenta UNKNOWN.
- La aritmética ordinaria con NULL produce NULL.
COUNT(*)cuenta filas;COUNT(column)cuenta entradas distintas de NULL.- Documenta por qué se permite NULL en cada columna.
4Identifica y conecta registros
Las claves responden dos preguntas diferentes: «¿Qué fila es esta?» y «¿A qué fila relacionada hace referencia?». Una clave primaria da a una tabla un identificador principal, mientras que una clave foránea contiene una referencia. Evalúa los posibles identificadores frente a datos futuros, no solo frente a una muestra pequeña. Después, lee los vínculos en ambas direcciones, incluido si son opcionales. Las claves compuestas y las tablas intermedias amplían estas mismas ideas a registros identificados por combinaciones y a relaciones muchos a muchos.
4.1 Claves candidatas y claves primarias
Una clave identifica una fila mediante sus valores. Los nombres pueden repetirse; los identificadores de cliente distinguen los registros para poder leerlos, modificarlos o vincularlos.
Comprueba la unicidad y la minimalidad
Una superclave es una columna o combinación que identifica una fila de forma única. Una clave candidata es una superclave mínima: eliminar cualquier columna hace perder esa garantía. Elige una candidata como clave primaria; las demás son claves alternativas.
Supón que employee_id, ssn y email son obligatorios y únicos por separado. Cada uno es una clave candidata. (employee_id, department) es una superclave, pero no una candidata: employee_id por sí solo identifica al empleado. Un apellido repetido no supera la prueba de unicidad.
| Término | Comprobación |
|---|---|
| Superclave | ¿La combinación identifica una fila? |
| Clave candidata | ¿Es única y no tiene columnas innecesarias? |
| Clave primaria | ¿Qué candidata es el identificador principal? |
| Clave alternativa | ¿Qué otra candidata sigue disponible? |
Cuatro clientes con apellidos diferentes no bastan para establecer una clave: un quinto podría compartir un apellido. La unicidad debe cumplirse para todos los datos futuros permitidos. Una repetición descarta una clave propuesta; una muestra sin repeticiones sigue necesitando una regla de negocio que la respalde.
Lee la declaración
Una tabla tiene como máximo una clave primaria. Sus valores son únicos y sus columnas no deben contener NULL. Los valores estables evitan cambios repetidos en las referencias. Busca PRIMARY KEY: ni el nombre de una columna ni su posición la declaran.
Si existe el cliente 1, se rechaza otro cliente con clave 1. Una clave omitida necesita un valor predeterminado o generado. INTEGER PRIMARY KEY de SQLite genera un entero cuando se omite o se indica NULL. Históricamente, algunas otras declaraciones de clave primaria en tablas ordinarias de SQLite permiten NULL; declarar NOT NULL explícitamente, utilizar una tabla STRICT o la forma de clave primaria entera evita esa excepción.
Lee una clave compuesta
En enrollments(student_id, course_id, term, grade), un estudiante puede cursar varias asignaturas y repetir una en otro periodo académico. (student_id, course_id, term) identifica una inscripción: una clave primaria compuesta, no tres claves primarias independientes.
Los componentes individuales pueden repetirse; la combinación completa no. La mayoría de los SGBD crea un índice de clave primaria para las búsquedas, pero la clave no garantiza el orden de salida de las consultas.
Puntos clave
- Una clave candidata es una superclave mínima.
- Una candidata es la clave primaria; las demás son claves alternativas.
- La unicidad de una clave debe cumplirse para los datos futuros permitidos.
- Una clave primaria es única, no admite NULL y puede abarcar varias columnas.
- La declaración establece la clave, no su nombre ni su posición.
4.2 Identificadores naturales y generados
Una clave natural procede de datos del mundo real, como el VIN de un vehículo, el ISBN de una edición de un libro o un código estatal. Una clave sustituta existe únicamente para identificar una fila, a menudo como un entero generado o un UUID.
Elige un identificador duradero
Prefiere valores únicos, presentes, estables, compactos y seguros de compartir. Los nombres se repiten; los teléfonos y correos cambian o se comparten. Los números de la Seguridad Social estadounidense son sensibles y algunos clientes no tienen uno; utilizarlos en las tablas que hacen referencia a ellos extiende esa información.
Un customer_id generado permite que Maria conserve el identificador 1 cuando cambian sus datos de contacto. Un state_code natural, como TX, puede funcionar bien porque es compacto, está estandarizado y resulta útil en los registros de direcciones.
Protege por separado los identificadores del negocio
La misma persona puede registrarse dos veces y recibir dos identificadores sustitutos. Los identificadores distinguen filas; no detectan personas duplicadas.
Si el correo debe identificar cada cuenta, utiliza NOT NULL UNIQUE. UNIQUE por sí solo permite varios NULL en PostgreSQL, SQLite y MySQL. SQL Server normalmente permite un NULL en una restricción de unicidad de una sola columna. La presencia y la unicidad son reglas independientes.
El correo obligatorio y único es una clave alternativa. Cambiarlo deja intacto el número sustituto de cliente en los pedidos existentes. Cambiar una clave primaria referenciada también exige mantener la coherencia de las referencias de sus filas hijas.
Reconoce la sintaxis de claves generadas
| Sistema | Forma habitual de generar enteros |
|---|---|
| SQL estándar, PostgreSQL, Oracle | GENERATED ALWAYS AS IDENTITY |
| MySQL | AUTO_INCREMENT |
| SQL Server | IDENTITY(1,1) |
| SQLite | INTEGER PRIMARY KEY |
PostgreSQL también tiene la forma antigua SERIAL. Las eliminaciones, las inserciones fallidas y el trabajo cancelado pueden dejar huecos. Los identificadores 1, 2 y 4 etiquetan tres filas, no cuatro. Renumerarlos para cerrar los huecos puede romper referencias.
Reconoce los UUID
Un UUID es un identificador de 128 bits, normalmente escrito con 36 caracteres y guiones: 7c9e6679-7425-40de-944b-e07fc1f90ae7. Las computadoras pueden generarlos de forma independiente con un riesgo muy bajo de coincidencia, lo que resulta útil cuando se combinarán registros de varios lugares.
Los UUID ocupan más espacio y son más difíciles de leer que los enteros pequeños. Elige según cómo se creen los registros y cómo se haga referencia a ellos. Cualquiera de estos tipos de clave es una etiqueta: su valor máximo no es un recuento de filas y su orden no tiene por qué reflejar el momento de los sucesos.
Puntos clave
- Las claves naturales proceden de identificadores del mundo real; las sustitutas existen para identificar filas.
- Prefiere claves primarias estables, compactas, presentes y seguras de compartir.
- Una clave sustituta no evita registros duplicados del mundo real.
NOT NULL UNIQUEpuede proteger un identificador alternativo obligatorio.- Los huecos en los identificadores generados son normales; los identificadores son etiquetas, no recuentos.
- Los UUID permiten generar identificadores de forma independiente con un riesgo muy bajo de coincidencia.
4.3 Claves foráneas y referencias válidas
Una clave foránea es una columna o un grupo de columnas que hace referencia a una clave primaria o a otra clave única adecuada. La tabla que contiene la referencia es la hija; la tabla a la que apunta es la padre. Una clave foránea distinta de NULL debe coincidir con una clave padre existente cuando se aplica la restricción.
Sigue un valor entre tablas
order_id | customer_id | order_date | shipped_date |
|---|---|---|---|
| 101 | 1 | 2026-03-02 | 2026-03-04 |
| 102 | 2 | 2026-03-05 | NULL |
| 103 | 1 | 2026-03-09 | 2026-03-10 |
orders.customer_id hace referencia a customers.customer_id. El pedido 102 apunta al cliente 2, James Wilson. Los pedidos 101 y 103 apuntan ambos al cliente 1, Maria Garcia. Se permiten repeticiones en la clave foránea; la clave padre referenciada es única.
Esta regla es la integridad referencial. Se rechaza un pedido para el cliente 99 si el cliente 99 no existe. De lo contrario, sería una fila huérfana: una hija sin un padre coincidente. Un nombre por sí solo no crea ninguna restricción. Una clave foránea llamada placed_by puede hacer referencia a customer_id; la referencia declarada crea el vínculo, con tipos coincidentes para las columnas de clave.
Opcional u obligatorio
Un coupon_id que admite NULL puede ser NULL cuando un pedido no tiene cupón. Un customer_id declarado NOT NULL exige que cada pedido tenga una referencia a un cliente, y la clave foránea exige que ese cliente exista. Estas dos restricciones trabajan juntas: una exige un valor y la otra comprueba la referencia.
Las claves foráneas no tienen por qué cruzar los límites de una tabla. En employees(employee_id, name, manager_id), manager_id puede hacer referencia a employee_id de la misma tabla. Quien ocupa la dirección general puede tener una referencia NULL a su responsable.
Los cambios en el padre necesitan una regla
| Acción | Efecto al eliminar un padre referenciado |
|---|---|
NO ACTION o RESTRICT | Rechaza la eliminación mientras queden referencias, según el momento de comprobación de la restricción |
CASCADE | También elimina las filas hijas que hacen referencia a él |
SET NULL | Conserva las hijas y deja su referencia en NULL; la columna debe permitir NULL |
Con la acción predeterminada, no se puede eliminar al cliente 1 mientras los pedidos 101 y 103 sigan haciendo referencia a ella. La eliminación en cascada de un pedido a sus líneas puede tener sentido porque esas líneas pertenecen a ese pedido. ON UPDATE especifica el comportamiento correspondiente cuando cambia una clave padre. La cascada no significa que eliminar una hija elimine a su padre.
Referencias compuestas y aplicación de restricciones
Si una línea de pedido se identifica mediante (order_id, product_id), un envío que hace referencia a esa línea necesita ambas columnas. La combinación debe coincidir con una línea existente. No basta con encontrar por separado un pedido y un producto: ese producto podría no haber aparecido nunca en ese pedido. Una referencia compuesta obligatoria declara todas sus columnas NOT NULL.
PostgreSQL, SQL Server, Oracle y el motor habitual InnoDB de MySQL hacen cumplir las claves foráneas declaradas. En SQLite, activa y comprueba la aplicación de las restricciones de clave foránea para cada conexión con PRAGMA foreign_keys = ON; antes de confiar en ellas. Una restricción declarada pero desactivada no puede proteger las filas. Las claves foráneas tampoco combinan por sí solas los resultados de las consultas; una consulta debe seguir explícitamente el vínculo, normalmente mediante una combinación.
Puntos clave
- El valor de una clave foránea distinto de NULL debe coincidir con una clave referenciada existente.
- Los valores de clave foránea pueden repetirse; los valores de clave padre son únicos.
NOT NULLhace obligatorio el vínculo.- Las acciones referenciales controlan las filas hijas cuando cambia un padre.
- Una referencia compuesta debe coincidir con la combinación completa de la clave padre.
- La aplicación de las restricciones de clave foránea de SQLite debe activarse para cada conexión.
4.4 Lee la cardinalidad de las relaciones en ambas direcciones
Para identificar una relación, haz dos preguntas: «Para una fila de aquí, ¿cuántas filas de allí pueden vincularse?» y después la pregunta inversa. Incluye el mínimo y el máximo. La muestra actual indica qué ha ocurrido; las restricciones describen qué se permite.
Un cliente, muchos pedidos
Un cliente puede realizar cero o más pedidos. Cada pedido de la tienda pertenece exactamente a un cliente porque orders.customer_id es una clave foránea que no admite NULL. Esta es una relación uno a muchos. La clave foránea corresponde a orders, el lado muchos: cada pedido almacena una referencia a un cliente.
Maria tiene los pedidos 101 y 103; James tiene el pedido 102. Aisha y Wei no tienen ninguno. Su ausencia de orders es válida. Una clave foránea exige un padre para cada hija, pero no exige que cada padre tenga una hija.
Uno a uno también necesita unicidad
En user_profiles(user_id, bio, photo_url), establece user_id como clave primaria y clave foránea hacia users. Cada perfil hace referencia a un usuario, y un usuario puede tener como máximo un perfil porque la clave del perfil no puede repetirse. Un usuario puede no tener perfil todavía.
Una clave foránea sin unicidad permitiría varios perfiles para el mismo usuario, lo que daría una relación uno a muchos. La restricción de unicidad cambia el máximo. Estas tablas de perfiles independientes pueden separar los datos opcionales o sensibles del registro principal del usuario.
Muchos a muchos utiliza una tabla de pares
Un pedido puede contener varios productos, y un producto puede aparecer en varios pedidos. Una tabla intermedia, también llamada tabla puente, de enlace o de asociación, registra cada emparejamiento:
order_id | product_id | cantidad | unit_price |
|---|---|---|---|
| 101 | 11 | 2 | 12,50 |
| 101 | 12 | 1 | 8,99 |
| 102 | 13 | 1 | 34,00 |
| 103 | 11 | 4 | 12,50 |
order_id hace referencia a orders; product_id hace referencia a products. La clave primaria compuesta (order_id, product_id) permite el mismo producto en distintos pedidos, pero impide que el mismo par aparezca dos veces. Dos vínculos uno a muchos implementan la relación muchos a muchos.
quantity y unit_price pertenecen al emparejamiento. Describen cuántas unidades de ese producto se vendieron en ese pedido y el precio cobrado entonces. El precio actual de un producto puede cambiar después; no debe modificar el importe histórico cobrado.
Para el pedido 101, los importes de las dos líneas son dos tazas a 12,50 u.m., que dan 25,00 u.m., y un cargador a 8,99 u.m. Juntos cuestan 33,99 u.m. La cantidad indica cuántas tazas se compraron; almacenar dos líneas de taza duplicadas entraría en conflicto con la clave elegida para esta tabla.
Evita las listas y los espacios fijos
Una celda product_ids que contiene «11,12» oculta varias referencias dentro de un valor de texto. Las columnas como product1, product2 y product3 imponen un límite fijo y dejan espacios sin utilizar. Una tabla intermedia añade una fila por cada emparejamiento adicional y permite que el SGBD compruebe cada referencia por separado.
Una relación autorreferencial utiliza el mismo patrón dentro de una tabla: muchos empleados pueden hacer referencia al mismo responsable mediante manager_id. El responsable también es una fila de empleado. Lee cada vínculo como un papel, para mantener diferenciadas la identidad del empleado y la referencia a su responsable.
Puntos clave
- Lee el mínimo y el máximo permitidos en cada dirección.
- Una relación uno a muchos almacena la clave foránea en el lado muchos.
- Una clave foránea única limita una relación a un máximo de una hija por padre.
- Una tabla intermedia representa vínculos muchos a muchos mediante filas de pares.
- Datos como la cantidad y el precio de venta pueden pertenecer a un emparejamiento.
- Una autorreferencia vincula papeles dentro de una tabla.
5Lee un esquema y sigue sus vínculos
Un esquema registra la estructura que da significado a las tablas: tipos de columnas, identificadores, referencias y restricciones. Un diagrama hace visibles esos vínculos, mientras que una definición de tabla expresa las reglas con precisión. Utiliza ambas formas para encontrar la ruta desde una pregunta hasta su respuesta, y después utiliza las filas reales para obtener los valores. Mantén separadas la estructura y los datos actuales: saber que los pedidos hacen referencia a clientes no indica qué clientes han realizado pedidos hoy.
5.1 Estructura, datos actuales y restricciones
Un esquema describe tablas, columnas, tipos de datos y restricciones. Una instancia son los datos almacenados en un momento concreto. Añadir un pedido cambia la instancia; añadir una columna nueva cambia el esquema. El esquema indica qué puede almacenarse, mientras que las filas indican qué está almacenado ahora.
Lee una descripción breve
customers(customer_id, first_name, last_name, email, phone, city, state, zip_code) enumera una tabla y sus columnas. Las notas pueden subrayar las claves primarias o marcarlas con PK, y marcar las referencias con FK. Por ejemplo, orders(order_id PK, customer_id FK → customers, order_date, shipped_date) identifica la clave principal y el vínculo con el cliente.
Lee una definición completa de tabla
CREATE TABLE orders (
order_id INTEGER PRIMARY KEY,
customer_id INTEGER NOT NULL REFERENCES customers (customer_id),
order_date DATE NOT NULL,
shipped_date DATE
);
Lee una columna cada vez. order_id es la clave primaria entera. customer_id es obligatorio y debe hacer referencia a un cliente. order_date es obligatorio. shipped_date puede ser NULL. Esta definición proporciona la estructura permitida, no una lista de pedidos existentes.
Las restricciones responden preguntas diferentes:
| Restricción | Qué comprueba |
|---|---|
PRIMARY KEY | Un identificador único de fila, posiblemente compuesto |
NOT NULL | Hay un valor presente |
UNIQUE | Se prohíben valores repetidos distintos de NULL; el tratamiento de NULL varía |
REFERENCES | Una referencia coincide con una clave padre |
CHECK | Una condición no debe ser FALSE |
DEFAULT | Proporciona un valor cuando se omite |
Un valor predeterminado no sustituye un valor no válido que se haya proporcionado. Si status tiene DEFAULT 'pending', omitir el estado aporta 'pending'; un valor proporcionado sigue teniendo que cumplir las demás reglas de la columna.
Combina reglas para una línea de pedido
CREATE TABLE order_items (
order_id INTEGER NOT NULL REFERENCES orders (order_id),
product_id INTEGER NOT NULL REFERENCES products (product_id),
quantity INTEGER NOT NULL CHECK (quantity > 0),
unit_price DECIMAL(8, 2) NOT NULL,
PRIMARY KEY (order_id, product_id)
);
La clave primaria al final utiliza dos columnas. Una segunda línea para el mismo pedido y producto se rechaza. La cantidad 0 no supera la comprobación. Una cantidad ausente incumple NOT NULL: la comprobación por sí sola permitiría NULL porque NULL > 0 es UNKNOWN, no FALSE. Declarar NOT NULL explícitamente en ambas partes de la clave también evita la excepción histórica de SQLite que permite NULL en claves compuestas. En SQLite, utiliza céntimos expresados como enteros para un unit_price exacto; la declaración decimal por sí sola no proporciona almacenamiento exacto.
Encuentra el esquema y sus significados
En la interfaz de comandos de SQLite, .schema orders muestra la definición; en psql de PostgreSQL, \d orders la describe. Las vistas INFORMATION_SCHEMA enumeran metadatos estructurales en PostgreSQL, MySQL y SQL Server. SQLite enumera los objetos en sqlite_schema, y las herramientas gráficas muestran tablas y columnas en un árbol.
«Esquema» también designa un espacio de nombres en sistemas como PostgreSQL y SQL Server. sales.orders significa la tabla de pedidos del esquema de ventas. Un diccionario de datos aporta significados que la estructura no puede expresar, como la moneda del precio o si una fecha de envío ausente significa «no enviado». Para ver filas, una consulta como SELECT * FROM orders; lee la instancia actual.
Puntos clave
- Un esquema es la estructura; una instancia son los datos en un momento concreto.
- Lee juntos el tipo de una columna y todas sus restricciones.
- Un número positivo obligatorio necesita tanto
NOT NULLcomo una comprobación de valor positivo. - Una clave primaria compuesta se declara sobre la combinación completa.
- Un diccionario de datos registra significados y unidades que van más allá del esquema.
5.2 Lee los extremos de una línea del esquema
Un diagrama del esquema representa cada tabla como un recuadro. El título nombra la tabla; el contenido enumera las columnas y, a menudo, sus tipos. PK marca las claves primarias y FK las foráneas. Las líneas de relación muestran qué clave foránea hace referencia a qué clave padre.
Identifica primero el tipo de línea
Algunos diagramas utilizan una flecha desde una clave foránea hasta la clave referenciada. Una flecha de orders.customer_id a customers.customer_id describe la dirección de la referencia. Otras herramientas utilizan símbolos en los extremos para describir cuántas filas pueden vincularse. Comprueba la leyenda del diagrama: la dirección de una flecha y la cardinalidad de una relación son información diferente.
Lee los símbolos de pata de cuervo
En la notación de pata de cuervo, una barra significa uno, un círculo significa cero y una pata de tres puntas significa muchos. Cada extremo de línea indica un mínimo y un máximo. El símbolo más cercano a la tabla da el máximo; el otro da el mínimo.
| Símbolos del extremo | Número permitido de filas en ese extremo |
|---|---|
| Barra y barra | Exactamente una |
| Círculo y barra | Cero o una |
| Barra y pata de cuervo | Una o más |
| Círculo y pata de cuervo | Cero o más |
Al leer desde una tabla, mira los símbolos junto a la otra tabla. Esos símbolos describen cuántas filas de allí pueden corresponder a tu única fila inicial.
Recorre clientes y pedidos
La línea de la tienda tiene símbolos de exactamente uno junto a customers y de cero o más junto a orders.
- Empieza con un cliente. Mira el extremo de los pedidos: el cliente puede tener cero o más pedidos.
- Empieza con un pedido. Mira el extremo de los clientes: el pedido pertenece exactamente a un cliente.
- Comprueba la definición: la clave foránea que no admite NULL está en
orders, por lo que es el lado muchos y cada pedido necesita un cliente válido.
La pata de cuervo está junto a la tabla que contiene la clave foránea que puede repetirse. Leer el extremo cercano al empezar desde esa misma tabla invierte el significado. Una referencia a cliente que admitiera NULL cambiaría el extremo de los clientes a cero o uno; no limitaría cada cliente a un pedido.
Reconoce una tabla intermedia
La tienda tiene vínculos uno a muchos de orders a order_items y de products a order_items. Ambos extremos muchos se encuentran en order_items. Sus dos claves foráneas forman la clave primaria. Esta estructura permite que un pedido contenga varios productos y que un producto aparezca en varios pedidos.
El diagrama describe conexiones permitidas, no los recuentos actuales. Permite que Maria tenga varios pedidos y que Aisha no tenga ninguno. Para saber cuántos tiene realmente cada una, lee las filas. Un mínimo de uno desde padre a hija puede expresar una regla de negocio adicional; una clave foránea por sí sola no exige que un padre tenga hijas.
Reconoce estilos de diagrama relacionados
Un diagrama entidad-relación creado durante el diseño puede mostrar entidades del negocio antes de que existan las tablas. Los diagramas de estilo Chen utilizan óvalos para los atributos y rombos para las relaciones. Un diagrama del esquema muestra las tablas reales y sus claves declaradas. Ambos ayudan a comunicar la estructura, pero sus símbolos deben leerse según su propia leyenda.
Puntos clave
- Un diagrama del esquema muestra tablas y vínculos de claves declarados.
- En cada extremo de línea, lee el mínimo y el máximo con ayuda de la leyenda.
- El extremo opuesto describe las filas vinculadas a una fila inicial.
- El extremo muchos de un vínculo uno a muchos contiene la clave foránea que puede repetirse.
- Dos extremos muchos que se encuentran en una tabla pueden revelar una tabla intermedia.
- Un diagrama indica las conexiones permitidas; las filas dan los recuentos reales.
5.3 Encuentra datos siguiendo claves
Localiza cada dato solicitado y sigue las claves que lo conectan con el registro inicial. Los nombres pueden repetirse o cambiar; haz coincidir los valores de las claves.
Encuentra el cliente de un pedido
«¿Dónde vive el cliente que realizó el pedido 102?» sigue esta ruta:
- Busca el pedido 102 mediante
orders.order_id. - Lee su
customer_id: 2. - Busca el cliente 2 mediante
customers.customer_id. - Lee
customers.city: Denver.
El número de pedido 102 no es el identificador del cliente. Las combinaciones SQL automatizan estas coincidencias de claves; las posiciones en pantalla no conectan los registros.
Encuentra productos y un total histórico
El pedido 101 tiene estas filas de order_items. Sigue cada product_id hasta products para obtener su nombre:
product_id | cantidad | unit_price | Nombre del producto |
|---|---|---|---|
| 11 | 2 | 12,50 | Taza de café |
| 12 | 1 | 8,99 | Cargador de teléfono |
Utiliza el precio registrado en la línea para calcular el importe cobrado:
- Dos tazas a 12,50 u.m. cuestan 25,00 u.m.
- Un cargador a 8,99 u.m. cuesta 8,99 u.m.
- Total: 33,99 u.m.
El precio actual del producto podría dar un coste incorrecto para un pedido antiguo. El pedido 102 tiene una lámpara a 34,00 u.m.; el pedido 103 tiene cuatro tazas a 12,50 u.m., con un total de 50,00 u.m.
Interpreta los valores ausentes y las reglas
La fecha de envío del pedido 102 es NULL, documentado aquí como «no enviado». Compruébalo con IS NULL, no con una igualdad a NULL.
Lee todas las restricciones pertinentes al evaluar un cambio:
- Una línea para el pedido 104 se rechaza si ese pedido no existe.
- Otra línea con clave (
101,11) se rechaza porque el par existe. - La cantidad 0 no supera la comprobación de cantidad positiva.
- El comportamiento predeterminado de la clave foránea impide eliminar el producto 11 mientras haya líneas que hagan referencia a él.
Una clave no utilizada no hace válida una fila si falta el destino de su referencia.
Identifica las filas nuevas
Un cliente que vuelve y compra dos productos existentes distintos añade una fila de orders y dos filas de order_items. El cliente y los productos ya existen. Ofrecer un producto nuevo añade una fila de products, sin exigir un pedido.
Puntos clave
- Localiza cada dato solicitado antes de seguir la ruta de claves.
- Haz coincidir los valores de claves foráneas con las claves referenciadas, no con nombres ni posiciones de filas.
- Utiliza el precio de la línea de venta para los totales históricos de pedidos.
- Comprueba todas las restricciones aplicables al evaluar un cambio propuesto.
- Un suceso nuevo añade filas a las tablas cuyos datos crea.
Ejemplos de Modelo relacional
1De los registros compartidos a las solicitudes a la base de datos
12 pasos
- 1Introducción¿Quién se encarga de los datos compartidos?
Los equipos de ventas, atención al cliente y dirección de una tienda utilizan los mismos registros de clientes. Una base de datos contiene estos datos compartidos, y un software llamado SGBD los gestiona.
Sigue cómo un sistema de bases de datos comparte estos datos, mantiene la coherencia de los cambios (tarea de una transacción) y responde a solicitudes de las aplicaciones.
- 2ExplicaciónDistingue la colección del software
Los datos son hechos registrados. Una base de datos es una colección organizada de datos relacionados; un SGBD es el software que la gestiona.
Los clientes y pedidos de la tienda son datos. PostgreSQL los almacena, comprueba reglas y responde a solicitudes.
- 3EjemploActualiza un teléfono
El teléfono de Maria aparece en 14 ventas de una hoja de cálculo. Una modificación olvidada deja copias contradictorias.
Almacena su teléfono una vez bajo
customer_id1 y haz que las ventas hagan referencia a ella. Cambiar el teléfono requiere entonces una actualización; cada venta conserva sus propios datos. - 4AnalogíaMantén unidos dos cambios
Una transferencia resta de la cuenta corriente y suma a la de ahorro. Guardar solo la resta dejaría saldos incorrectos.
Una transacción guarda ambos cambios juntos o deshace ambos, incluso entre filas o tablas.
- 5DesafíoElige la protección
Una reserva reduce el número de asientos disponibles, pero falla al guardar su registro de pago. Los dos cambios pertenecen a una transacción. ¿Qué debe quedar después de deshacer esa transacción?
---reveal---
No debe quedar ninguno de los cambios. Deshacer la reducción de asientos restaura la disponibilidad anterior y no se guarda ningún registro de pago de esa transacción fallida. Conservar solo el cambio de asientos dejaría una reserva parcial.
- 6ConexiónReconoce la carga de trabajo
Realizar un pedido es trabajo transaccional: unas pocas lecturas y escrituras rápidas. Comparar ventas mensuales por región es trabajo analítico: resumir muchos registros históricos.
Una base de datos de ventas puede servir para ambas actividades.
- 7ExplicaciónSigue la solicitud de la aplicación
Los clientes envían solicitudes a un servidor de bases de datos, como en PostgreSQL o SQL Server. SQLite se ejecuta como una biblioteca dentro de la aplicación, sin un servidor independiente.
Un proveedor de servicios gestionados en la nube opera servidores para sus usuarios; las tablas y las solicitudes siguen utilizándose.
- 8EjemploLee una solicitud declarativa
SELECT first_name, city FROM customers WHERE state = 'TX';solicita dos columnas de los clientes de TX.SQL es declarativo: expresa el resultado y deja los pasos de recuperación al SGBD. SQL es el lenguaje; PostgreSQL es uno de los productos que lo interpretan.
- 9ConsejoLee la función de la sentencia
ALTER TABLEmodifica la estructura;INSERTañade una fila;GRANTgestiona un permiso;COMMITguarda una transacción.El texto utiliza comillas simples:
'TX'. Duplica un apóstrofo interno:'O''Brien'. Un punto y coma suele finalizar una sentencia. - 10DesafíoElige estructura o datos
Una tienda añade una columna
delivery_notey después la rellena para un pedido. ¿Son ambos cambios en las filas?---reveal---
Añadir la columna modifica la estructura: definición de datos. Rellenarla modifica los datos almacenados: manipulación de datos.
- 11DesafíoRelaciona las partes
Un sitio web envía SQL a un servidor PostgreSQL para registrar una compra. Más tarde, un responsable lee una vista ordinaria de ventas. ¿Contiene la vista otra copia almacenada de todas esas filas de compras?
---reveal---
No. Una vista ordinaria guarda una consulta que lee los datos subyacentes; no almacena filas de resultados independientes. PostgreSQL sigue siendo el SGBD que gestiona los registros de compras, mientras que el sitio web y la herramienta de informes son clientes.
- 12RepasoUna colección compartida con responsabilidades claras
Una base de datos contiene datos; un SGBD gestiona el almacenamiento, las reglas, el acceso y la recuperación. Las transacciones mantienen unidos los cambios.
Las solicitudes SQL se refieren a la estructura, las filas, los permisos o el control de transacciones. Identifica la función antes de leer los detalles.
2Lee el significado de una tabla
10 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónEmpieza por lo que representa una fila
- 2EjemploEncuentra la ciudad de un cliente
- 3ExplicaciónUtiliza los nombres formales
- 4DesafíoPredice dos tipos de incorporaciones
- 5Idea claveIdentifica registros sin posiciones
- 6AnalogíaMantén un valor por propiedad
- 7ExplicaciónRelaciona un tipo con su dominio
- 8DesafíoInterpreta una exportación de una hoja de cálculo
- 9DesafíoComprueba un registro nuevo y sus valores
- 10RepasoLee la estructura antes que los valores
3Elige el almacenamiento y razona con NULL
15 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónDos decisiones para cada columna
- 2ExplicaciónDistingue las familias numéricas
- 3ConsejoObserva las diferencias entre productos
- 4DesafíoComprueba un intervalo decimal
- 5ConexiónReconoce fechas e indicadores
- 6ExplicaciónElige según la finalidad del valor
- 7EjemploAlmacena el dinero de forma exacta
- 8DesafíoCorrige un código y una cantidad
- 9ExplicaciónInterpreta lo que falta
- 10EjemploSigue una comparación desconocida
- 11Idea claveUtiliza la prueba de valor ausente
- 12DesafíoCombina lo conocido y lo desconocido
- 13EjemploCuenta lo que está presente
- 14DesafíoComprueba la interpretación de un informe
- 15RepasoDeja que el significado guíe el almacenamiento
4Crea vínculos fiables mediante claves
18 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónLa identidad precede al vínculo
- 2ExplicaciónComprueba la unicidad y la minimalidad
- 3DesafíoComprueba una inscripción futura
- 4ConsejoDeclara una clave primaria
- 5ExplicaciónElige una etiqueta estable
- 6Idea claveMantén una regla de negocio independiente
- 7DesafíoInterpreta un hueco sin renumerar
- 8EjemploSigue la referencia de un pedido
- 9ExplicaciónReferencias obligatorias y opcionales
- 10DesafíoLee una regla de eliminación
- 11ConexiónComprueba la referencia completa
- 12ExplicaciónLee uno a muchos en ambos sentidos
- 13EjemploLimita un vínculo a uno
- 14EjemploRepresenta cada emparejamiento de producto
- 15Idea claveAlmacena un dato sobre el par
- 16DesafíoElige un vínculo para una situación nueva
- 17DesafíoCombina identidad y referencias
- 18RepasoLas claves cumplen funciones diferentes juntas
5Lee un esquema para responder una pregunta
14 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónDistingue el mapa de los registros
- 2EjemploLee una definición de pedido
- 3Idea claveCombina una comprobación con un valor obligatorio
- 4DesafíoClasifica dos cambios
- 5ConsejoEncuentra las reglas completas
- 6ExplicaciónLee la leyenda de un diagrama
- 7EjemploEmpieza con una fila y mira al otro extremo
- 8DesafíoPredice un vínculo opcional
- 9ConexiónDetecta una tabla de pares
- 10EjemploSigue el pedido 102 hasta su ciudad
- 11EjemploCalcula a partir de las líneas de venta
- 12DesafíoEvalúa una línea propuesta
- 13DesafíoConecta datos, reglas y significado
- 14RepasoUtiliza cada fuente para su información
Ejercicios de Modelo relacional
Set 1: Lee registros, tipos y vínculos sencillos10 Preguntas de Práctica
Pregunta 1 de 10
DECIMAL(7, 2)?Mostrar respuestaOcultar respuesta
Pregunta 2 de 10
Mostrar respuestaOcultar respuesta
Pregunta 3 de 10
Mostrar respuestaOcultar respuesta
Pregunta 4 de 10
Mostrar respuestaOcultar respuesta
Pregunta 5 de 10
badge_number esté presente y sea único. Los departamentos se repiten. ¿Por qué (badge_number, departamento) es una superclave, pero no una clave candidata?Mostrar respuestaOcultar respuesta
badge_number único, por lo que el par no es mínimo. Los departamentos repetidos no anulan la unicidad del par; la columna innecesaria impide que sea una clave candidata.Pregunta 6 de 10
Mostrar respuestaOcultar respuesta
0047 como 47-A como etiquetas. Un entero pierde los ceros iniciales y no puede representar la letra y el guion. Elige un tipo según la finalidad del valor.Pregunta 7 de 10
WHERE region <> 'NE'?Mostrar respuestaOcultar respuesta
Pregunta 8 de 10
event_id hacia Events que no admite NULL y cuya restricción se aplica. Existen los eventos 12 y 19. Dos entradas ya hacen referencia al evento 12. ¿Qué ocurre con una tercera entrada que hace referencia al evento 12?Mostrar respuestaOcultar respuesta
Pregunta 9 de 10
Mostrar respuestaOcultar respuesta
Pregunta 10 de 10
quantity INTEGER CHECK (quantity > 0) y status TEXT DEFAULT 'new'. Ninguna columna tiene NOT NULL. Una fila nueva proporciona una cantidad NULL y omite el estado. ¿Qué se almacena?Mostrar respuestaOcultar respuesta
Set 2: Aplica reglas en una base de datos pequeña10 Preguntas de Práctica
Guarda esta unidad para ver todas las respuestas y practicar cada set.
Pregunta 1 de 10
open_jobs y un índice sobre jobs.job_id. ¿Qué función cumple cada uno?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 2 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 3 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 4 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 5 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 6 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 7 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 8 de 10
VARCHAR(4). Una fila proporciona el texto «Nieves». ¿Qué hace SQLite?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 9 de 10
account_id 14. Accounts tiene la cuenta 14 en Phoenix y la cuenta 620 en Tulsa. El account_id del pedido hace referencia a Accounts.account_id. ¿Dónde está la cuenta del pedido 620?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 10 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Set 3: Elige tipos y sigue registros vinculados10 Preguntas de Práctica
Guarda esta unidad para ver todas las respuestas y practicar cada set.
Pregunta 1 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 2 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 3 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 4 de 10
delay_days NULL y estado 'urgent'. ¿Cuál es el resultado de (delay_days > 2) OR (status = 'urgent') y conserva WHERE la fila?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 5 de 10
tracking_note como columna nueva para cada entrega. ¿Qué propiedad cambia directamente?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 6 de 10
member_id generado como clave primaria. El correo debe estar presente e identificar como máximo una cuenta. ¿Qué declaración adicional hace cumplir ambas reglas del correo en PostgreSQL?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 7 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 8 de 10
Profiles.user_id es a la vez su clave primaria y una clave foránea hacia Users.user_id. Ninguna regla exige que un usuario tenga un perfil. ¿Qué permite esto?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 9 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 10 de 10
warehouse_id, item_id) con las filas (4, 7) y (5, 9). Reservations tiene una clave foránea compuesta obligatoria hacia StockRows cuya restricción se aplica. ¿Se permite una reserva para (4, 9)?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Set 4: Lee restricciones y explica sus consecuencias10 Preguntas de Práctica
Guarda esta unidad para ver todas las respuestas y practicar cada set.
Pregunta 1 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 2 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 3 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 4 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 5 de 10
order_id, product_id), y ambas partes son claves foráneas. ¿Qué muestra esto entre pedidos y productos?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 6 de 10
person_id como locker_id son obligatorios y únicos por separado. La clave primaria es person_id. ¿Cómo debe clasificarse locker_id?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 7 de 10
DECIMAL(8, 2). ¿Qué información adicional se necesita para interpretar un precio almacenado de 45,00 como un importe del mundo real?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 8 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 9 de 10
DECIMAL(6, 2) y una etiqueta VARCHAR(3). Las filas proporcionan el importe 1 234 567,89 y la etiqueta «Verano». ¿Qué exigen esas declaraciones por sí solas?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 10 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Set 5: Resuelve datos ausentes y restricciones conectadas10 Preguntas de Práctica
Guarda esta unidad para ver todas las respuestas y practicar cada set.
Pregunta 1 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 2 de 10
batch_id, page_no). El par (18, 4) existe. Los números de lote y página pueden repetirse por separado. ¿Qué fila propuesta se rechaza específicamente por duplicar esta clave?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 3 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 4 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 5 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 6 de 10
Orders.customer_id es una clave foránea hacia Customers que no admite NULL y no tiene regla de unicidad. Los clientes pueden no tener pedidos. Añadir UNIQUE a Orders.customer_id deja intactas las demás reglas. ¿Cómo cambia la relación?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 7 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 8 de 10
WHERE NOT (city = 'Miami') OR city IS NULL?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 9 de 10
a INTEGER NOT NULL, b INTEGER NOT NULL, PRIMARY KEY (a, b) y q INTEGER NOT NULL CHECK (q > 0). No existen filas. ¿Qué fila propuesta cumple todas estas restricciones?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 10 de 10
project_id que admite NULL con ON DELETE SET NULL. La nota 4 hace referencia a la tarea 7 mediante una clave foránea cuya restricción se aplica con ON DELETE CASCADE. Tras eliminar el proyecto 31, se elimina la tarea 7. ¿Qué queda de la tarea 9 y la nota 4?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
¿Te atascas con una pregunta tuya? Ayuda con Tareas
Términos Clave
A
Acción referencial
ON DELETE SET NULL conserva las filas hijas, pero elimina su referencia al padre, por lo que esa referencia debe permitir NULL.Afinidad de tipo
abc como texto cuando falla la conversión a entero.B
Base de datos
Base de datos relacional
C
Cardinalidad de una relación
Cardinalidad de una tabla
Carga de trabajo analítica (OLAP)
Carga de trabajo transaccional (OLTP)
Cascada
Céntimos expresados como enteros
Clave alternativa
account_id generado.Clave candidata
employee_id se convierta en la clave primaria.Clave compuesta
Clave foránea
customer_id 1 y hacer referencia al mismo registro único de cliente.Clave natural
state_code de dos letras como clave primaria legible en los registros de direcciones.Clave primaria
customer_id como clave primaria para que los pedidos puedan hacer referencia a un cliente concreto.Clave sustituta
customer_id permanece fijo cuando el cliente cambia de correo, teléfono o apellido.Código de moneda
Código numérico
02108 necesita almacenamiento de texto para conservar el cero inicial al recuperar el valor.Columna (atributo o campo)
city contiene un valor de ciudad, o NULL cuando se permite, para cada registro de cliente.Combinación
orders.customer_id con customers.customer_id para llegar a la ciudad correcta.D
Datos
Datos estructurados
Diagrama del esquema
orders.customer_id con la clave de cliente y hace visible la referencia de los pedidos a los clientes.Diagrama entidad-relación
Dialecto SQL
LIMIT 10 para limitar un resultado, mientras que SQL Server suele utilizar TOP 10.Diccionario de datos
shipped_date NULL significa no enviado o una fecha que se ha perdido.Dominio
E
Escala
DECIMAL(p, s) es s, el número de dígitos después de la coma decimal, que determina su precisión fraccionaria.Esquema de base de datos
F
Fila (tupla o registro)
Fila huérfana
Formato de fecha ISO
2026-03-02.G
Grado
Í
Índice
I
Identificador generado
INTEGER PRIMARY KEY de SQLite proporciona un entero cuando una fila nueva omite el identificador.Identificador único universal (UUID)
Importe de la línea
Independencia de los datos
Instancia de base de datos
Integridad referencial
IS NULL
IS NULL es la prueba SQL que devuelve verdadero cuando falta una entrada y permite encontrar esas filas sin una comparación de igualdad.phone IS NULL identifica a los clientes cuyos teléfonos no se han registrado.L
Lenguaje de definición de datos (DDL)
Lenguaje de manipulación de datos (DML)
Línea de pedido
Lógica trivalente
M
Motor de base de datos integrado
N
NOT NULL
NOT NULL es una restricción que exige que la entrada de una columna esté presente y rechaza NULL sin comprobar por sí sola la positividad ni que el texto no esté vacío.Notación de pata de cuervo
NULL
P
Precisión
DECIMAL(p, s) es p, el número total de dígitos disponibles entre las partes entera y decimal de un valor.DECIMAL(8, 2), ocho dígitos totales dejan espacio para seis antes de la coma y dos después.R
Relación autorreferencial
manager_id de un empleado apunta a otra fila de empleado, con NULL para una persona que no tiene responsable.Relación muchos a muchos
Relación opcional
coupon_id NULL mientras otros pedidos hacen referencia a cupones existentes.Relación uno a muchos
Relación uno a uno
user_id como clave primaria y clave foránea, lo que impide un segundo perfil para un usuario.Restricción
Restricción CHECK
NOT NULL junto con CHECK (quantity > 0) para cubrir ambas reglas.Ruta de claves
customer_id hasta una fila de cliente y lee la ciudad de esa fila.S
Sistema cliente-servidor
Sistema de gestión de bases de datos (SGBD)
SQL
Superclave
employee_id es único, emparejarlo con el departamento sigue identificando al empleado, pero añade una columna adicional.T
Tabla (relación)
Tabla intermedia
order_items vincula un pedido con un producto y registra la cantidad y el precio unitario cobrado.Tablas padre e hija
Tipo booleano
in_stock registra si un artículo está disponible; su forma exacta de almacenamiento varía según el SGBD.Tipo de caracteres
MUG-11-BLU corresponde a almacenamiento de texto porque es una etiqueta, no una cantidad.Tipo de coma flotante
Tipo decimal exacto
DECIMAL(8, 2) almacena importes exactos en unidades monetarias y céntimos dentro de su intervalo.Tipo entero
Transacción
U
UNKNOWN
state <> 'TX' es UNKNOWN para un cliente cuyo estado es NULL, por lo que WHERE omite esa fila.V
Valor atómico
Valor predeterminado
DEFAULT 'pending' registra pending cuando la fila nueva deja el estado sin especificar.Vista
Sobre esta unidad
Crea tus propios Materiales de Estudio
Convierte tus notas, diapositivas y documentos en Guías de Estudio, Preguntas de Práctica, Flashcards y 6 herramientas más.