JavaRush /Blog Java /Random-ES /Entrevista al desarrollador: análisis de preguntas sobre ...

Entrevista al desarrollador: análisis de preguntas sobre la base de datos

Publicado en el grupo Random-ES
¡Hola a todos! Todos estamos aquí trabajando para lograr un objetivo: convertirnos en desarrolladores de Java . Quizás la etapa más importante en el camino hacia el profesionalismo sea la entrevista técnica. Como regla general, el entrevistador analiza los temas principales y hace un par de preguntas. En este artículo, hablaremos sobre uno de esos temas clave: las bases de datos . Veamos las preguntas más frecuentes e intentemos responderlas sin profundizar en el material, ¡porque en este caso el volumen del libro no nos bastará! Entonces vamos.Entrevista al desarrollador: análisis de preguntas de la base de datos - 1

1. ¿Qué son las bases de datos? ¿En qué tipos se dividen?

¿Qué se entiende por DBMS?

Entrevista al desarrollador: análisis de preguntas de la base de datos - 2Una base de datos (DB) es una estructura organizada diseñada para almacenar, cambiar y procesar información interrelacionada, principalmente grandes volúmenes. En otras palabras, una base de datos es un almacenamiento de datos estructurado. Por ejemplo, una guía telefónica.

Tipos de bases de datos

  1. Una base de datos relacional es una colección de datos con relaciones predefinidas entre ellos. Los datos se almacenan como un conjunto de tablas que consta de columnas y filas. Las tablas almacenan información sobre los objetos representados en la base de datos. Cada columna de la tabla almacena un tipo de datos específico y cada celda almacena un valor de atributo.
  2. Los sistemas no relacionales (NoSQL) son sistemas diseñados para modelos de datos específicos con esquemas flexibles. En otras palabras, se trata de bases de datos que almacenan datos no en forma de esquemas tabulares, filas y columnas, sino en otros formatos.
Puede leer más sobre bases de datos no relacionales en este artículo: Una guía de NoSQL para desarrolladores . Un sistema de gestión de bases de datos (DBMS) es un conjunto de software con el que el usuario puede crear bases de datos (DB) y realizar sobre ellas diversas operaciones: complementar, actualizar, eliminar, seleccionar, etc. El DBMS garantiza la seguridad, integridad y seguridad de almacenamiento de datos y le permite otorgar acceso a la administración de la base de datos. Por ejemplo, MySql es un DBMS que proporciona acceso a una base de datos relacional o MongoDB para una no relacional.

2. ¿Qué es la normalización? ¿Forma normalizada? ¿Cuántas formas de normalización existen? Nombra los tres primeros.

La normalización es el proceso de organizar y estructurar datos en una base de datos, lo que proporciona una mayor flexibilidad de la base de datos al eliminar la redundancia y la inconsistencia de las dependencias. La forma normal es una propiedad de una tabla, considerada en el contexto de la normalización, que caracteriza la tabla en términos de simplicidad y corrección de la estructura. La forma normal se define como un conjunto de requisitos que debe satisfacer una tabla. Hay seis formas normales en total, pero en la práctica no se utilizan más que las tres primeras:
  1. Primera forma normal:
    • Todos los atributos son simples (es decir, atómicos e indivisibles);
    • Todos los datos son escalares (es decir, positivos);
    • No hay filas duplicadas (para ello, se crea una clave primaria para cada fila).
  2. Segunda forma normal:
    • Se cumplen las condiciones de la primera forma normal;
    • Cada atributo que no es clave hace referencia a una clave principal.
  3. Tercera forma normal:
    • Se cumplen las condiciones del segundo grupo normal;
    • Los campos sin clave son independientes de otros campos sin clave: solo se pueden asociar con una clave principal.

3. Desnormalización

La desnormalización es la reducción o violación deliberada de formas de normalización de bases de datos, generalmente para acelerar la lectura de la base de datos agregando datos redundantes. En general, este es un proceso inverso a la normalización. Esto sucede porque la teoría de las formas normales no siempre es aplicable en la práctica. Por ejemplo, los valores no atómicos no siempre son “malos”: a veces incluso lo contrario. En algunos casos, se necesitan uniones adicionales al ejecutar consultas, especialmente cuando se procesa una gran cantidad de información. En última instancia, esto puede mejorar el rendimiento. Las bases de datos destinadas a análisis a menudo se desnormalizan para acelerar la ejecución de consultas. Por ejemplo, a menudo tomará muestras de algunos datos para informes en los que las columnas que no son clave estarán relacionadas entre sí. Elimina intencionalmente la tercera forma de normalización y combina todo en una tabla para facilitar el muestreo, de modo que no tenga que realizar consultas adicionales en otras tablas.

4. Índices

Un índice es un conjunto ordenado de valores asociados a una tabla o vista con una columna específica que acelera la recuperación de datos. Es decir, se trata de una especie de índice: como el alfabeto de una guía telefónica, que nos ayuda a la hora de buscar por apellido. Si se usa correctamente, esta característica puede mejorar enormemente el rendimiento cuando se trabaja con bases de datos grandes. O puedes bajarlo mucho. Para acelerar la búsqueda, estas claves se almacenan en una estructura de árbol equilibrada a través de la cual se realiza la búsqueda. Como regla general, es necesario ingresar índices en los campos que se buscan con mayor frecuencia. Debería pensar en crear un índice no antes de que tenga al menos 10 mil registros. De lo contrario, no verá un resultado notable, porque la optimización prematura es MAL . ¿Y cómo puede un índice afectar el rendimiento del sistema? Cuando se insertan datos nuevos o se eliminan datos antiguos, se volverá a calcular la estructura de árbol equilibrada. En realidad, cuantos más datos e índices, más árboles habrá que contar. Imagine la situación: tiene alrededor de 20.000 registros y 7 índices en esta tabla. Es decir, al insertar datos, es necesario recalcular 7 árboles, cada uno con 20.000 registros. Estrictamente hablando, no se recomienda en absoluto el uso de índices para tablas en las que se agregarán o eliminarán datos con frecuencia. Finalmente, me gustaría señalar que los índices de las columnas en las que se encuentra a menudo el valor nullno serán tan efectivos, por lo que no vale la pena agregarlos a dichas columnas.

¿Cuál es la diferencia entre índices agrupados y no agrupados en SQL?

Agrupados:

  • Proporciona orden físico para el campo seleccionado;
  • Si una tabla tiene un índice agrupado, se dice que está agrupada;
  • No se necesita más de un índice por tabla;
  • En MySQL, el usuario no especifica explícitamente un índice agrupado, porque si no define una CLAVE PRIMARIA en su tabla, MySQL encuentra el primer índice UNIQUEdonde están todas las columnas clave NOT NULLe InnoDB lo usa como índice agrupado.

No agrupados:

  • Son posibles hasta 999 índices no agrupados por tabla;
  • Contiene un puntero a filas con datos reales en la tabla;
  • No proporciona orden físico;
  • Para los índices no agrupados, hay tablas separadas con datos ordenados, es decir, una tabla para una columna en la que se encuentra el índice, por lo tanto, al solicitar datos que no forman parte de un campo determinado, la consulta se realizará primero en el campo en esta tabla, y solo entonces la consulta adicional en una fila en la tabla original.
Crear un índice no agrupado:
CREATE INDEX index_name ON table_name(column_name)

6. ¿Qué es un índice compuesto?

Índice compuesto : creado mediante el envío a varias columnas al mismo tiempo. En otras palabras, es un índice complejo que consta de varias columnas. Estos índices se utilizan cuando aparece más de una columna en una consulta. Creando un índice compuesto:
CREATE INDEX index_name ON table_name(first_column_name, second_column_name, third_column_name)
Normalmente, estos índices se utilizan cuando los datos de varias columnas están relacionados lógicamente.

7. ¿Qué es un índice de cobertura? ¿Índice único?

Un índice de cobertura es un índice que es suficiente para responder una consulta sin acceder a la tabla misma. Con este índice, puede obtener la fila completa de datos, pero en realidad esto simplemente no es necesario. Debido a que no es necesario ir directamente a la tabla fuente y puede responder usando solo el índice, los índices de cobertura son un poco más rápidos de usar. Al mismo tiempo, no olvide que cuantas más columnas, más engorroso y lento se vuelve el índice. Entonces no deberías abusar de esto. Anteriormente hablamos de índices agrupados y no agrupados, que pueden ser únicos . Esto significa que no hay dos campos que tengan el mismo valor para la clave de índice. De lo contrario, el índice no será único porque varias filas pueden contener el mismo valor. Un ejemplo de creación de un índice único no agrupado:
CREATE UNIQUE INDEX index_name ON table_name(column_name)

8. ¿Qué es una clave primaria?

La clave principal es un campo en una tabla que identifica cada fila en una tabla de base de datos. Solo puede haber un campo de este tipo en una tabla y todos los valores deben ser únicos. ¿No te recordó nada? Entrevista al desarrollador: análisis de preguntas de la base de datos - 3Después de todo, una clave primaria no es más que un índice agrupado único . Como regla general, las claves primarias se crean al crear una tabla:
CREATE TABLE table_name(
column_name int PRIMARY KEY,..)
Se agregará automáticamente una restricción a esta columna: NOT NULL. También puede configurar una clave para una tabla ya creada:
ALTER TABLE table_name ADD PRIMARY KEY (column_name);
Si se agrega una clave principal de la manera descrita anteriormente, entonces se verifican los valores de los campos especificados como clave principal ( column_name) para garantizar que no contengan valores nulos (también se agregará una restricción - NOT NULL).

¿Qué es una clave externa?

Una clave externa es una propiedad creada para proporcionar una relación entre tablas. Normalmente, una clave externa se establece en las columnas de una subtabla y apunta a una de las columnas de la tabla principal. Se puede especificar como al crear una tabla:
CREATE TABLE table_name{
column_name int,..
FOREIGN KEY(column_name) REFERENCES another_table_name(another_table_column_name) }
Entonces después de crear la tabla:
ALTER TABLE table_name
ADD FOREIGN KEY(column_name) REFERENCES another_table_name(another_table_column_name));
Puede establecer el comportamiento de una clave externa al manipular el campo al que hace referencia. Las manipulaciones pueden ser de los siguientes ON DELETEtipos ON UPDATE: Posibles opciones de comportamiento:
  • CASCADE— con esta propiedad, las filas de la tabla dependiente se eliminarán o cambiarán automáticamente cuando las filas relacionadas se eliminen o cambien en la tabla principal;
  • SET NULL— con esta propiedad, cuando se elimina o actualiza una fila relacionada de la tabla principal, NULLse establecerá el valor de la columna de clave externa;
  • NO ACTION— rechaza los intentos de eliminar o cambiar filas en la tabla principal si hay filas relacionadas en la tabla dependiente;
  • RESTRICT- equivalente a NO ACTION;
  • SET DEFAULT- con esta propiedad, cuando se elimina o actualiza una fila relacionada de la tabla principal, se establecerá el valor predeterminado (si lo hay) para la columna de clave externa.
Ejemplo de uso:
CREATE TABLE table_name{
column_name int,..
FOREIGN KEY(column_name) REFERENCES another_table_name(another_table_column_name) ON UPDATE CASCADE ON DELETE CASCADE }
ON DELETESi el comportamiento de y no se establece explícitamente ON UPDATE, el comportamiento se establecerá en RESTRICT.

10. Tipos de conexiones entre tablas (Join)

La conexión entre tablas se proporciona en base a datos (campos) comunes. Esto sucede usando un operador JOIN, una operación que hace coincidir filas de una tabla con filas de otra. El mapeo se realiza de manera que las columnas de ambas tablas sean adyacentes, aunque se pueden obtener de tablas separadas. Y si tenemos campos comunes para tres tablas, podemos mostrar sus datos como una tabla común. Sin embargo, vale la pena considerar que cuantas menos tablas se unan, más rápido se ejecutará la consulta. Entonces, los tipos JOIN:
  • INNER JOIN- una conexión que muestra solo aquellos datos de la primera tabla que corresponden a algunos datos de la segunda tabla. El resto baja.Entrevista al desarrollador: análisis de preguntas de la base de datos - 4
  • LEFT JOIN- una conexión que muestra todos los datos de la primera tabla y los datos correspondientes de la segunda, si los hubiera. Si no hay datos correspondientes, los campos de datos de la segunda tabla estarán vacíos.Entrevista al desarrollador: análisis de preguntas de la base de datos - 5
  • RIGHT JOIN- una conexión que muestra todos los datos de la segunda tabla y los datos correspondientes de la primera, si los hubiera. Si no hay datos correspondientes, los campos para los datos de la primera tabla estarán vacíos.Entrevista al desarrollador: análisis de preguntas de la base de datos - 6
  • FULL JOIN- una conexión que muestra todos los datos de la primera y segunda tabla. Si no hay datos relacionados en la otra tabla, los campos para esos datos estarán vacíos.Entrevista al desarrollador: análisis de preguntas de la base de datos - 7
  • CROSS JOIN- una unión cruzada en la que cada fila de la primera tabla se une a cada fila de la segunda tabla (cada una con cada una). Es decir, si dos tablas tienen 3 filas cada una, tras esta unión obtendremos un resultado de 9 filas.Entrevista al desarrollador: análisis de preguntas de la base de datos - 8
Ejemplo Join(inner):
SELECT *
FROM first_table
INNER JOIN second_table ON first_table.some_column = second_table.some_column

11. ¿Qué es una propiedad ACID en una base de datos?

A - Atomicidad , garantiza que ninguna transacción se confirme parcialmente en el sistema. O se realizan todas sus suboperaciones o ninguna. Por ejemplo, transferir dinero de un banco a otra cuenta implica dos operaciones:
  1. Transferir dinero a una cuenta bancaria.
  2. Transferir dinero desde una cuenta bancaria a una cuenta específica.
Pero cualquier cosa puede pasar. Por ejemplo, irán al banco y luego ocurrirá algún error y la segunda operación no se completará. O viceversa: sólo se realizará la segunda operación. Por tanto, estas acciones se llevan a cabo dentro de una sola transacción y el resultado es todo o nada. C - Coherencia : Cada transacción exitosa siempre registra solo resultados resolubles. Esto garantiza que se cumplan todas las restricciones (por ejemplo, NOT NULL); de lo contrario, la transacción se revertirá. Y - aislamiento : durante la ejecución de una transacción, las transacciones paralelas no deberían afectar su resultado. Esto nos brinda la capacidad de ocultar a todos los estados de datos no finales. En realidad, es por eso que las transacciones fallidas no pueden romper nada. Un poco más abajo nos familiarizaremos con los niveles de aislamiento de transacciones. D - Durabilidad : Si se completa una transacción, entonces puede estar seguro de que los cambios realizados no se cancelarán debido a alguna falla.

12. Niveles de aislamiento de transacciones

Cada nivel de aislamiento permite/prohíbe ciertas acciones (oportunidades):
  • lectura fantasma : dentro de la misma transacción, la misma solicitud de datos da resultados diferentes, lo que ocurre debido a la adición de datos por otra transacción (paralela).
  • lectura no repetida : dentro de la misma transacción, la misma solicitud de datos da resultados diferentes, lo que ocurre debido al cambio o eliminación de datos por parte de otra transacción (paralela).
  • lectura "sucia" : lectura de datos agregados o modificados por una transacción que no se revertirá posteriormente;
  • Actualización perdida : cuando diferentes transacciones cambian el mismo bloque de datos al mismo tiempo, todos los cambios excepto el último se pierden (similar a una "condición de carrera" en subprocesos múltiples).
Por conveniencia, consideramos los niveles de aislamiento y sus capacidades en la tabla:
Niveles de aislamiento lectura fantasma Lectura no repetitiva lectura “sucia” actualización perdida
SERIALIZABLE + + + +
REPEATABLE_READ - + + +
LEER_COMMITTED - - + +
LEER_UNCOMMITTED - - - +

13. ¿Qué es la inyección SQL?

La inyección SQL es uno de los métodos para piratear un sitio web, cuya esencia es la inyección de algún código SQL en los datos a través de GETconsultas POSTo cookies. Si un sitio web realiza tales inyecciones, es posible obtener acceso a la base de datos y piratear la aplicación. Por ejemplo, conocemos el nombre de alguna variable. Digamos column_namecon tipo boolean. Si el sistema es susceptible a inyecciones, podemos agregar OR column_name=truey luego escribir todo lo que necesitemos de la base de datos. ORcreará una condición OR, y nuestra expresión después siempre será true, lo que nos llevará más lejos. Es posible un ataque a un sitio web como la inyección SQL debido al procesamiento inadecuado de los datos entrantes utilizados en las consultas SQL. Cuando se conecta a una base de datos mediante JDBC , se utilizan varios archivos Statements. Para aumentar la seguridad, es necesario utilizar PreparedStatementen lugar del habitual Statement, ya que cuando se utiliza, Statementlas cadenas de consulta y los valores simplemente se suman, haciendo posible las inyecciones. A su vez, existe PreparedStatementuna plantilla de solicitud específica, y en ella se insertan los datos con las comillas reflejadas. Como resultado, las inyecciones de SQL se percibirán sólo como una representación de cadena de algún campo. Para protegerse contra inyecciones de SQL, puede utilizar comprobaciones basadas en expresiones regulares (puede leer más sobre expresiones regulares en este artículo ). Entrevista al desarrollador: análisis de preguntas sobre la base de datos - 9Otra opción es establecer un límite en la cantidad de caracteres de los parámetros entrantes: por ejemplo, si debe recibir un número no mayor a 9999, un límite de cuatro caracteres entrantes será suficiente. Reducirá el riesgo de piratería mediante inyecciones SQL. Puede obtener más información sobre la seguridad en Java en el artículo "Seguridad en Java: mejores prácticas" .

14. ¿Qué son los procedimientos almacenados? ¿Funciones almacenadas? ¿Desencadenar?

Los procedimientos almacenados en SQL son una entidad en la base de datos, que es un conjunto de instrucciones SQL que se compila una vez y se almacena en el servidor. En una palabra, este es un análogo de los métodos en Java. Los procedimientos almacenados pueden realizar acciones sobre los datos, tanto consultas normales como algunas acciones que no están disponibles para consultas normales. Un procedimiento es una entidad SQL que se crea una vez y luego se llama pasando argumentos. La ventaja de este enfoque es que estas instrucciones se pueden reutilizar más de una vez. Los procedimientos almacenados mejoran el rendimiento, mejoran las capacidades de programación y admiten funciones de seguridad de datos. Consideremos la creación de un procedimiento:
CREATE PROCEDURE procedure_name (first_param some_type, second_param some_type..)
 begin
……...
 end
Llamando al procedimiento:
CALL procedure_name (first_param, second_param…..);
Una función almacenada es un tipo de procedimiento almacenado. La diferencia entre una función es que siempre devuelve un solo valor, mientras que un procedimiento siempre devuelve un conjunto de valores. Los procedimientos almacenados no se pueden mezclar con SQL normal, mientras que una función almacenada sí, y ésta es su ventaja. Por otro lado, las funciones almacenadas tienen muchas más limitaciones que los procedimientos. Creando una función almacenada:
CREATE FUNCTION function_name (first_param, second_param…..)
RETURNS some_type
 begin
……...
RETURN some_value;
end
Llamar a una función almacenada:
SELECT function_name(first_param, second_param…..);
Un disparador es otro tipo de procedimiento almacenado al que el usuario no llama directamente, sino que se activa cuando se modifican los datos. Es decir, este procedimiento se activa cuando se cumplen ciertas condiciones, como por ejemplo, INSERTo DELETE, o UPDATEdatos en una determinada columna de una tabla determinada. Cuando se activa un disparador se determina utilizando las palabras clave BEFORE(el disparador se dispara antes del evento asociado) o AFTER(después del evento).
CREATE TRIGGER trigger_name
ON table_name
AFTER INSERT
 begin
……...
 end

15. Practica

Sea como fuere, la pregunta SQL más común en una entrevista será la práctica: la resolución de problemas. No tiene sentido intentar adivinar con qué tareas te encontrarás, porque todo depende de la sofisticación de la imaginación de la persona de enfrente. Por lo tanto, la única opción funcional sería mejorar las consultas SQL de diversa complejidad. sql-ex.ru puede servir como recurso para practicar diversas tareas . Después de las primeras veinte tareas completadas, será bastante difícil que tu interlocutor te asuste con cualquier tarea SQL. Entrevista al desarrollador: análisis de preguntas sobre la base de datos - 11Eso es todo por hoy: espero que después de leer este artículo, las preguntas sobre bases de datos no causen dificultades ni problemas. ¡Gracias por su atención y nos vemos de nuevo!
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION