Pregunta

Las porciones de "s" (BAW grandes culo páginas web) están utilizando técnicas de almacenamiento y recuperación de datos que se basan en grandes tablas con índices, y el uso de consultas que no / no se puede usar combinaciones en sus consultas (BigTable, HQL , etc) para hacer frente a las bases de datos y escalabilidad sharding. ¿Cómo funciona eso cuando tiene montones y montones de datos que es muy Relacionado?

Sólo puedo especular que gran parte de esta unión se tiene que hacer en el lado de la aplicación de las cosas, pero no que empiezan a ser caro? ¿Qué pasa si usted tiene que hacer varias consultas a varias tablas diferentes para obtener información para compilar? No está afectando a la base de datos que muchas veces empezando a tener más caros que simplemente usando une en primer lugar? Supongo que depende de la cantidad de datos que tienes?

Y para comúnmente disponibles ORM, ¿cómo tienden a hacer frente a la imposibilidad de usar combinaciones? ¿Hay apoyo para esto en ORM que están en uso pesado hoy? O hacen la mayoría de los proyectos que tienen que acercarse a este nivel de datos tienden a rodar su propio de todos modos?

Así que esto no es aplicable a cualquier proyecto en el que estoy haciendo, pero es algo que ha estado en mi cabeza desde hace varios meses que solo puedo especular acerca de lo que "las mejores prácticas" son. Nunca he tenido la necesidad de abordar esto en cualquiera de mis proyectos, ya que nunca han llegado a una escala donde sea necesario. Con suerte esta pregunta ayuda a otras personas, así ..

Como alguien dijo más adelante, ORM "no funcionan" sin juntas. ¿Hay otras capas de acceso a los datos que ya están disponibles para los desarrolladores que trabajan con datos en este nivel?

EDIT: Por alguna aclaración, Vinko Vrsalovic dijo:

  

"Creo risita se quiere hablar   acerca de No-SQL, donde los datos transaccional   se desnormalizado y utilizado en Hadoop o   BigTable o Cassandra esquemas ".

Esto es precisamente lo que estoy hablando.

Los puntos de bonificación para aquellos que capturan la referencia xkcd.

¿Fue útil?

Solución

La forma en que se mire, una base de datos relacional es una herramienta de propósito general para cubrir sus apuestas. Las computadoras modernas son lo suficientemente rápido, y RDBMS' son lo suficientemente que puede crecer hasta un tamaño muy respetable en una sola caja bien optimizados. Al elegir un RDBMS usted se está dando un acceso muy flexible a sus datos y la capacidad de tener fuertes limitaciones de corrección que hacen que sea mucho más fácil de codificar en contra de los datos. Sin embargo, el RDBMS no va a representar una buena optimización para cualquier problema particular, que sólo le da la flexibilidad para cambiar los problemas con facilidad.

Si comienza a crecer rápidamente y darse cuenta de que va a tener que escalar más allá del tamaño de un único servidor de base de datos, de repente tiene opciones mucho más difícil de hacer. Tendrá que comenzar a identificar los cuellos de botella y la eliminación de ellos. El RDBMS va a ser un nudo enmarañado desagradable de la codependencia que usted tiene que desmenuzar. Cuanto más interconectado sus datos más trabajo que tendrá que hacer, pero tal vez no tendrá que separar por completo todo el asunto. Si va a leer pesado tal vez puede llegar a funcionar con la replicación sencilla. Si está saturando el mercado y el crecimiento se está nivelando tal vez se puede parcialmente desnormalizar y fragmento de número fijo de servidores de base de datos. Tal vez sólo hay un puñado de mesas de problemas que se pueden mover a un almacén de datos más escalable. Tal vez su perfil de uso es muy amable y la memoria caché se puede simplemente migrar la carga a un grupo memcached gigante.

Cuando los almacenes de valores clave escalables como BigTable vienen en es cuando ninguno de los anteriores puede trabajar, y hay tantos datos de un solo tipo que, incluso cuando se deshace la normalización de una sola tabla es demasiado para un servidor. En este punto es necesario ser capaces de repartirse de manera arbitraria y aún así tener una API limpia para acceder a ella. Naturalmente, cuando los datos se extendió a cabo a través de tantas máquinas no se puede tener algoritmos que requieren estas máquinas a hablar entre sí tanto, que muchos de los algoritmos relacionales estándar requiere. Como usted sugiere, estos algoritmos que consultan distribuidos tienen el potencial de requerir más potencia de procesamiento total del equivalente unirse en una base de datos relacional adecuadamente indexados, sino porque están paralelizados el rendimiento en tiempo real es varios órdenes de magnitud mejor que cualquier máquina solo podía hacer (suponiendo una máquina que podría contener todo el índice incluso existe).

Ahora, una vez que usted puede escalar sus enormes conjunto de datos horizontalmente (con sólo conectar en más servidores), la parte dura de escalabilidad se realiza. Así que no debería decir Listo , ya que las operaciones y el desarrollo en curso en esta escala son mucho más duro que la aplicación de un solo servidor, pero el punto es servidores de aplicaciones suelen ser trivial para escalar a través de una cuota de nada arquitectura en la medida que puedan obtener los datos que necesitan en el momento oportuno.

Para responder a su pregunta sobre cómo ORM utilizados comúnmente manejan la imposibilidad de utilizar combinaciones, la respuesta corta es no lo hacen . ORM significa Objeto Relational Mapping, y la mayor parte del trabajo de un ORM se acaba traduciendo el poderoso paradigma relacional de simples estructuras de datos orientadas a objetos lógica de predicados. La mayor parte del valor de lo que te dan, simplemente no va a ser posible a partir de un almacén de claves-valor. En la práctica es probable que necesite para construir y mantener su propia capa de acceso a datos que se adapte a sus necesidades particulares, ya que los perfiles de datos en estas escalas van a variar dramáticamente y creo que hay demasiadas ventajas y desventajas de una herramienta de propósito general a surgir y convertirse en la forma dominante de los RDBMS tienen. En pocas palabras, siempre se tendrá que hacer más trabajo de campo en esta escala.

Dicho esto, que sin duda será interesante ver qué tipo de funcionalidad agregada relacional u otro puede ser construido en la parte superior de las primitivas del almacén de clave y valor. Realmente no tengo suficiente experiencia aquí a comentar específicamente, pero hay una gran cantidad de conocimiento en la empresa computing sobre este que se remontan a muchos años (por ejemplo. Oracle), una gran cantidad de conocimientos teóricos sin explotar en el mundo académico, una gran cantidad de conocimiento práctico en Google, Amazon, Facebook, y otros, pero el conocimiento de que se ha filtrado a la comunidad más amplia de desarrollo es siendo bastante limitada.

Sin embargo, ahora que una gran cantidad de aplicaciones se están moviendo a la web, y cada vez más de la población mundial está en línea, inevitablemente, más y más aplicaciones tendrán que escalar, y las mejores prácticas comenzarán a cristalizarse. La brecha de conocimiento se tallaba hacia abajo desde ambos lados por los servicios de nube como AppEngine y EC2, así como bases de datos de código abierto como Cassandra. En cierto sentido esto va de la mano con la computación paralela y asíncrona, que también está en su infancia. Sin duda, un momento fascinante para ser un programador.

Otros consejos

Estás empezando a partir de una suposición errónea.

El almacenamiento de datos no normaliza los datos de la misma manera que una aplicación de transacción normaliza. No hay "un montón" de combinaciones. Hay relativamente pocos.

En particular, segunda y tercera forma normal violaciónes no son un "problema", ya que los almacenes de datos rara vez se actualizan. Y cuando se ponen al día, por lo general es sólo un cambio indicador de estado para hacer una dimensión filas como "actual" frente a "no corriente".

Dado que usted no tiene que preocuparse acerca de las actualizaciones, no se descomponen las cosas hasta el nivel donde 2NF una actualización no puede conducir a relaciones anómalas. No hay actualizaciones significa que no hay anomalías; y ninguna descomposición y sin juntas. Usted puede pre-unirse a todo.

general, los datos DW se descompone de acuerdo con un esquema de estrella. Esto le guía para descomponer los datos en las tablas numéricas "hecho" que contienen las medidas - números con unidades -. Y las referencias de clave externa a la dimensión

Una dimensión (o "entidad") es el mejor pensamiento como una cosa en el mundo real con atributos. A menudo, esto incluye cosas como la geografía, el tiempo, producto, cliente, etc. Estas cosas tienen a menudo complejas jerarquías. Las jerarquías son generalmente arbitraria, definida por diversas necesidades de información de negocios, y no modelado como tablas separadas, sino simplemente columnas en la dimensión utilizada para la agregación.


Para hacer frente a algunas de sus preguntas.

"esta unión se tiene que hacer en el lado de la aplicación de las cosas". Mas o menos. Los datos son "pre-unieron" antes de ser cargado. Los datos de dimensión es a menudo una unión de los datos fuente relevantes acerca de esa dimensión. Se unió y se carga como una estructura relativamente plana.

No se actualiza. En lugar de cambios, se insertan los registros históricos adicionales.

"pero no significa que empiezan a ser caro?". Mas o menos. Se necesita un cierto cuidado para obtener los datos cargados. Sin embargo, no hay una gran cantidad de informes / análisis une. Se pre-se unió a los datos.

Las cuestiones ORM son en gran medida irrelevante, ya que se pre-se unió a los datos. Su ORM se correlaciona con el hecho o dimensión según el caso. Excepto en casos especiales, las dimensiones tienden a ser pequeñas ish y encajan completamente en memoria. La excepción es cuando estás en Finanzas (bancarios o de seguros) o de Servicios Públicos y tienen enormes bases de datos de clientes. Estos dimensión cliente rara vez se encaja en la memoria.

A JOIN es un término relacional pura y no todas las bases de datos relacionales son.

Otros modelos de bases de datos tienen otras maneras de construir relaciones.

bases de datos de red utilizan las cadenas sin fin de find a key - fetch the reference - find a key que debe ser programado con un lenguaje de programación común.

El código se puede ejecutar en el lado de la aplicación o en el lado del servidor, pero no es SQL y ni siquiera basado en conjuntos.

Si se diseñan adecuadamente, una base de datos de red puede bу mucho más rápido que un ser relacional.

Por ejemplo, una base de datos de red puede almacenar una referencia a otra entidad como un puntero directo a un desplazamiento en un archivo o incluso un bloque en un disco donde se almacena la información sobre esta entidad.

Esto hace que atraviesa las redes adicional rápido -. Si usted escribió un código eficiente de hacerlo

Una base de datos relacional puede sólo referencias tienda como pares de valores básicos como números enteros (o triples o tuplas de orden superior).

Para encontrar esos valores en la base de datos relacional, el motor debe hacer lo siguiente:

  • Para saber donde la tupla que contiene reside el primer valor
  • Para el segundo valor
  • Para la dirección de la raíz en un B-Tree que contiene los datos del segundo número se refiere a
  • Traverse este árbol
  • Encuentra el puntero a la tabla real (que puede ser almacenado como un B-Tree sí mismo, en cuyo caso el puntero es el valor de la PRIMARY KEY de la fila que buscamos)
  • Encuentra fila de la tabla por el puntero o recorrer la tabla
  • Por último, obtener el resultado.

Y se puede controlar esto sólo hasta cierto punto. Después de que, sólo emite la consulta SQL y esperar.

Modelo relacional hecho para simplificar la vida de los desarrolladores, no para alcanzar la velocidad súper siempre y no importa qué.

Este es el mismo que el montaje vs lenguajes de alto nivel, modelo relacional de ser un lenguaje de alto nivel.

Es posible que desee leer el artículo en mi blog

, en el que trato de explicar las diferencias entre varios modelos de bases de datos de uso común.

Cuando denormalise sus datos de esta manera, lo hace para evitar el costo de unirse a elementos dispares; se acepta que algunos datos pueden ser duplicadas y que ciertas formas de combinar puede ser difícil, para el beneficio de rendimiento de la utilización de consultas simples.

Si va a tener que hacer ningún gran cantidad de unirse a nivel de aplicación, implica que usted no ha desnormalizaremos lo suficiente.

Lo ideal es que usted será capaz de hacer una consulta para cualquier conjunto de datos que desea. En la práctica, no debería tener que utilizar más de dos o tres consultas para cualquier aspecto de su aplicación, y cualquier unirse a nivel de aplicación será más la recuperación de un trivial de cosas de los conjuntos de resultados separados para la inserción en la vista.

Este tipo de cosas sólo es realmente necesario para conjuntos de datos verdaderamente masiva, y hay todo tipo de ventajas y desventajas involucradas. Para dar sólo un ejemplo: BigTable no puede hacer consultas agregados, como que le da un recuento. Se puede utilizar para darle una cifra que es más o menos precisa - en el sentido de que si tiene, por ejemplo, 12,149,173 registros de los cuales se añadieron 23.721 en la última hora, que en realidad no importa si es lo mejor que se puede averiguar es que usted tiene "aproximadamente 12.100.000 registros". Si su aplicación depende de conocer la cifra exacta en un momento dado, entonces no debería estar utilizando BigTable por ello, es la actitud general.

Aplicaciones como Facebook tienen muy pocos cambios en los datos, la mayoría de las veces los usuarios se envíen nuevos artículos. Así que el hecho de que los registros se multiplican deben actualizarse cuando se cambia un elemento es un problema menor.

  

Esto le permite a los datos no sean   normalizada sin golpear el común   problemas con las actualizaciones.

Aplicaciones como Amazon pueden permitirse el lujo de cargar todos los datos para un solo usuario en la RAM (lo grande que es un carro de compras después de todo?), A continuación, actualizar los datos en la memoria RAM y escribir como un único elemento de datos.

  

Una vez que la eliminación de nuevo la necesidad de tener   la mayoría de los datos normalizados.

está negociando la ampliación de la facilidad de desarrollo de aplicaciones, por lo que si usted no necesita escalar a grandes alturas es posible que desee mantener la facilidad de desarrollo de aplicaciones que proporcionan RDBMS.

Creo que en estas situaciones se va a ser más o menos por su cuenta y va a tener que rodar todo usted mismo. No he estado allí, pero he considerado que para algunos de nuestros proyectos. Puede ser bastante grande con DB relacionales (como se demuestra SO) por lo que continuará gozando de la bondad relacional por ahora.

En general, el almacenamiento de datos se basa en el uso de uniones y los datos se dividieron en dimensiones y tablas de hechos (con los llamados "esquemas de estrella", etc)

Las combinaciones a menudo se pre-calculado y almacenado como tablas de-normalizados.

No estoy al tanto de cualquier herramienta ORM que trabajan con sistemas de bases de datos que no permiten uniones, ya que estos no son vistos generalmente como bases de datos relacionales tradicionales.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top