wow español database database-design database-performance sharding database-partitioning

database - español - Partición de la base de datos: Horizontal vs Vertical. ¿Diferencia entre Normalización y División de Fila?



sharding mongodb español (4)

Particionamiento horizontal en la base de datos

Manteniendo todos los campos EG: Table Employees has

  • carné de identidad,
  • nombre,
  • Localización geográfica ,
  • correo electrónico,
  • designacion,
  • teléfono

Por ejemplo: 1. Mantener todos los campos y distribuir los registros en varias máquinas. Diga ID = 1-100000 o 100000-200000 registros en una máquina cada uno y distribúyalos en varias máquinas.

EG: 2. Mantener bases de datos separadas para regiones EG: Asia Pacífico, América del Norte

Clave: selección de un conjunto de filas según un criterio

Particionamiento vertical en la base de datos

Es similar a la Normalización donde la misma tabla se divide en varias tablas y se usa con combinaciones si es necesario.

EG: id , name , designation se pone en una tabla y
phone , email que no se accede con frecuencia se ponen en otro.

Clave: seleccionando un conjunto de columnas según un criterio.

  • La escala horizontal / vertical es diferente de la partición

Escala horizontal:

se trata de agregar más máquinas para permitir una mejor capacidad de respuesta y disponibilidad de cualquier sistema, incluida la base de datos. La idea es distribuir la carga de trabajo a varias máquinas.

Escalado vertical:

se trata de agregar más capacidades en forma de CPU, memoria a la máquina o máquinas existentes para permitir una mejor capacidad de respuesta y disponibilidad de cualquier sistema, incluida la base de datos. En una configuración de máquina virtual se puede configurar virtualmente en lugar de agregar máquinas físicas reales.

Sameer Sukumaran

Intento comprender los diferentes conceptos de Particionamiento de Bases de Datos y esto es lo que entendí de él:

Partición horizontal / Sharding : dividir una tabla en una tabla diferente que contendrá un subconjunto de las filas que estaban en la tabla inicial (un ejemplo que he visto mucho si dividiera una tabla Users por Continent, como una sub tabla para Norteamérica, otro para Europa, etc ...). Cada partición está en una ubicación física diferente (entender ''máquina''). Tal como lo entendí, el Particionamiento Horizontal y el Sharding son exactamente lo mismo (?).

Partición vertical : por lo que entendí ( http://technet.microsoft.com/en-us/library/ms178148%28v=sql.105%29.aspx ), hay 2 tipos de particiones verticales:

  • Normalización (que consiste en eliminar redundancias de una base de datos dividiendo tablas y vinculándolas con una clave externa).

  • Row Splitting , esto es lo que no entiendo, ¿cuál es la diferencia entre Normalization y Row Splitting ? ¿En qué se diferencian esas 2 técnicas?

También he leído en esta publicación ( Diferencia entre escala horizontal y vertical para bases de datos ) que la diferencia entre el Partición Horizontal y el Partición Vertical es que en el primero escala agregando más máquinas, mientras que en el segundo escala agregando más potencia ( CPU, RAM) a su máquina existente, ¿es esa una definición correcta? Pensé que la diferencia principal entre esas 2 técnicas reside en la forma en que divide sus tablas.

Lamento la cantidad de preguntas, pero estoy un poco confundido ya que muchos sitios web diferentes con los que me he encontrado dicen cosas diferentes.

Cualquier aclaración ayuda sería muy apreciada. Cualquier enlace a una demostración clara y simple con algunas tablas también sería muy útil.


El particionamiento es un concepto bastante general y se puede aplicar en muchos contextos. Cuando considera la partición de datos relacionales, por lo general se refiere a la descomposición de sus tablas, ya sea por filas (en sentido horizontal) o en columnas (verticalmente).

El particionamiento vertical, también conocido como división de filas, utiliza las mismas técnicas de división que la normalización de bases de datos, pero usualmente el término (vertical / horizontal) de partición de datos se refiere a una optimización física mientras que la normalización es una optimización en el nivel conceptual .

Como usted solicita una demostración simple, suponga que tiene una tabla como esta:

create table data ( id integer primary key, status char(1) not null, data1 varchar2(10) not null, data2 varchar2(10) not null);

Una forma de dividir data verticalmente : divídalo de la siguiente manera:

create table data_main ( id integer primary key, status char(1) not null, data1 varchar2(10) not null ); create table data_rarely_used ( id integer primary key, data2 varchar2(10) not null, foreign key (id) references data_main (id) );

Este tipo de partición se puede aplicar, por ejemplo, cuando rara vez necesita datos de columna2 en sus consultas. La partición data_main ocupará menos espacio, por lo tanto, los escaneos de tablas completas serán más rápidos y es más probable que encajen en el caché de páginas del DBMS. La desventaja: cuando tienes que consultar todas las columnas de data , obvio debes unir las tablas, lo que será más costoso que consultar la tabla original.

Observe que está dividiendo las columnas de la misma manera que lo haría al normalizar las tablas. Sin embargo, en este caso los data ya podrían estar normalizados a 3NF (e incluso a BCNF y 4NF), pero usted decide dividirlos aún más por razones de optimización física.

Una forma de dividir los data horizontal , utilizando la sintaxis de Oracle:

create table data ( id integer primary key, status char(1), data1 varchar2(10), data2 varchar2(10) ) partition by list (status) ( partition active_data values ( ''A'' ), partition other_data values(default) );

Esto le indicaría al DBMS que almacene internamente los data la tabla en dos segmentos (como dos tablas), dependiendo del valor del status de la columna. Esta forma de particionar los data se puede aplicar, por ejemplo, cuando normalmente consulta solo las filas de una partición, por ejemplo, las filas de estado ''A'' (llamémoslas filas activas). Al igual que antes, los análisis completos serán más rápidos (especialmente si hay pocas filas activas), las filas activas (y las otras filas respectivamente) se almacenan contiguamente (no se dispersarán alrededor de páginas que compartan con filas de un archivo diferente). el valor de estado, y es más probable que las filas activas estén en la memoria caché de la página.


La diferencia entre Normalización y división radica en el propósito de hacerlo.

El objetivo principal de la Normalización es eliminar los datos redundantes Cuando el propósito de la división de filas es separar menos datos requeridos.

por ejemplo: - Supongamos que tiene una tabla Todos_Detalles con columnas-id, Emp_name, Emp_address, Emp_phNo, Emp_other_data, Company_Name, Company_Address, Company_revenue.

Ahora, si quiere normalizar la tabla, debería crear dos nuevas tablas Employee_Details y Company_Details y mantener una clave foránea de company_id en la tabla Employee_Details. de esta manera, se eliminarán los datos redundantes de la empresa.

Ahora hablemos sobre división de filas. Digamos que incluso después de la normalización, solo está accediendo a employee_name y emp_phNo, pero no está accediendo a emp_address y emp_other_data con tanta frecuencia. Para mejorar el rendimiento, divide la tabla Employee_Details en dos tablas. table1 que contiene los datos frecuentemente necesarios (employee_name y emp_phNo) y table2 que contiene los datos menos necesarios (Emp_address, Emp_other_data). Ambas tablas tendrán la misma columna unique_key para que puedas recrear cualquier fila de la tabla Employee_Details con unique_key. Esto puede mejorar el rendimiento de su sistema drásticamente.


Los problemas con una sola base de datos surgen cuando comienza a ser enorme. Por lo tanto, es necesario dividirlo para reducir el espacio de búsqueda, de modo que pueda ejecutar las acciones requeridas más rápidamente. Hay varias estrategias de partición disponibles, por ejemplo: partición horizontal, partición vertical, partición basada en hash, partición basada en búsqueda. La escala horizontal y vertical es un concepto diferente en comparación con estas estrategias.

  1. Partición horizontal : divide la tabla / colección dada en varias tablas / colecciones en función de información clave que puede ayudar a obtener la tabla correcta, ya que la partición horizontal tendrá varias tablas en diferentes nodos / máquinas. por ejemplo: información de usuarios expertos de la región.

  2. Partición vertical : divide las columnas en varias partes como se menciona en una de las respuestas anteriores, por ejemplo, columnas relacionadas con la información del usuario, Me gusta, comentarios, amigos, etc. en la aplicación de redes sociales.

  3. Partición basada en hash : Utiliza la función hash para decidir la tabla / nodo, y toma los elementos clave como entrada en la generación de hash. Si cambiamos el número de tablas, se requiere una reorganización de los datos que es costosa. Entonces, hay un problema cuando desea agregar más tabla / nodo.

  4. Partición basada en búsqueda : utiliza una tabla de búsqueda que ayuda a redireccionar a diferentes tablas / base de nodos en campos de entrada dados. Podemos agregar fácilmente una nueva tabla / nodo en este enfoque.

Escalado horizontal vs escalado vertical : cuando diseñamos cualquier aplicación, también debemos pensar en escalar. ¿Cómo vamos a manejar una gran cantidad de tráfico en el futuro? Necesitamos pensar en términos de consumo de memoria, latencia, uso de la CPU, tolerancia a fallas, resiliencia. La escala vertical agrega más recursos, por ejemplo: CPU, memoria a una sola máquina para que pueda manejar el tráfico entrante. Pero hay limitaciones con este enfoque, no se puede agregar más recurso que cierto límite. La escala horizontal permite que el tráfico venidero se distribuya entre varios nodos. Necesita tener un equilibrador de carga en el frente que básicamente maneje el tráfico y navegue el tráfico a cualquier nodo. La escala horizontal le permite agregar una cantidad suficiente de servidores, pero también necesitará estos muchos nodos.