Pregunta sobre bases de datos

No tengo ni puta idea de bases de datos, así que igual digo alguna burrada XD

Me gustaría saber si es posible algo así:
Base de datos con unos 30M (30 millones) de "referencias primarias" Esas referencias llevan tb una serie de datos asociados. Esos 30 millones podrían subdividirse por lo menos entre 10 "categorias" si eso hace la lectura más ligera/liviana.

Imaginemos que las "referencias primarias" son solo 28, el alfabeto.

El cliente pregunta a la base de datos por "J" la BD mira "J" y sus datos asociados, si alguno de los datos asociados tiene un resultado positivo, le muestra al cliente dicho resultado. Por ejemplo, el cliente está buscando si "J" se apellida perez o gomez, J consulta y en caso de tener esos apellidos, devuelve esa info al cliente. (los "apellidos" de "J" pueden variar de un día para otro) Si no los tiene no devuelve nada. Cientos de consultas simultaneas desde distintos clientes.
Existe algo así, verdad? que empiezo a mirar para coger info? XD
MySql mismo (cualquiera, depende de si va enfocado a web o no, equipo/server que lo ejecuta etc).

Necesitarás los create table, y luego los select para las consultas. No se... es que es lo normal, tendrás que leer todo lo básico de cualquier tipo de BBDD xD
exitfor escribió:MySql mismo (cualquiera, depende de si va enfocado a web o no, equipo/server que lo ejecuta etc).

Necesitarás los create table, y luego los select para las consultas. No se... es que es lo normal, tendrás que leer todo lo básico de cualquier tipo de BBDD xD

Vale pero que entonces 30 millones no son demasiados ¿no? Aunque haya cientos de consultas simultaneas y demás que necesiten respuesta "casi" inmediata.
Gaiden escribió:
exitfor escribió:MySql mismo (cualquiera, depende de si va enfocado a web o no, equipo/server que lo ejecuta etc).

Necesitarás los create table, y luego los select para las consultas. No se... es que es lo normal, tendrás que leer todo lo básico de cualquier tipo de BBDD xD

Vale pero que entonces 30 millones no son demasiados ¿no? Aunque haya cientos de consultas simultaneas y demás que necesiten respuesta "casi" inmediata.


Facebook usa MySQL (muy modificado eso sí), y maneja muchos más datos.
Rokzo escribió:
Gaiden escribió:
exitfor escribió:MySql mismo (cualquiera, depende de si va enfocado a web o no, equipo/server que lo ejecuta etc).

Necesitarás los create table, y luego los select para las consultas. No se... es que es lo normal, tendrás que leer todo lo básico de cualquier tipo de BBDD xD

Vale pero que entonces 30 millones no son demasiados ¿no? Aunque haya cientos de consultas simultaneas y demás que necesiten respuesta "casi" inmediata.


Facebook usa MySQL (muy modificado eso sí), y maneja muchos más datos.

Fíjate que no se me había ocurrido pensar algo tan simple como eso XD
Gracias [oki]
Gaiden escribió:
exitfor escribió:MySql mismo (cualquiera, depende de si va enfocado a web o no, equipo/server que lo ejecuta etc).

Necesitarás los create table, y luego los select para las consultas. No se... es que es lo normal, tendrás que leer todo lo básico de cualquier tipo de BBDD xD

Vale pero que entonces 30 millones no son demasiados ¿no? Aunque haya cientos de consultas simultaneas y demás que necesiten respuesta "casi" inmediata.


La mayoría de bases de datos relacionales admiten no solo claves primarias sino también los llamados "índices". Cuando tu marcas una columna como "índice" la BD optimiza las búsquedas por esos campos casi como si de claves primarias se tratase. Eso si, si buscas "per" para encontrar "perez" (búsqueda parcial) el rendimiento va a ser peor. De BDs no relacionales no tengo ni puta idea (el mongoDB ese que está tan de moda).

También se puede "normalizar" el modelo de datos para mejorar el rendimiento. El proceso convierte tu bonito y manejable modelo de datos en uno más horroroso y coñazo de mantener pero matemáticamente más eficiente.

De todas formas si de verdad tienes 30 millones de registros y cientos de consultas simultáneas te va a hacer falta un pepinaco de servidor si o si. Yo he currado en sistemas con 40.000 usuarios y ya había que tener buenos bichos [+risas] Siguiendo el ejemplo de Facebook, ellos no solo tienen su propio fork de mysql ultra-tuneado sino que también diseñan su propio hardware.

Disclaimer: Aunque si he diseñado algún que otro modelo de datos, no soy experto en bases de datos. A mi me sacas de 4 joins o una subselect sencillita y ya me pierdo [carcajad]
El volumen de datos no es problema. El problema lo vas a tener con el servidor como sea limitadito, a poco que las peticiones sean elevadas.
30 millones tampoco es que sean demasiado datos para una base de datos robusta, y con robuesta me refiero a cualquier sistema de base de datos que no esté creado para almacenar datos en un computador personal (SQLite por ejemplo). Así que MySQL debe ser más que suficiente para lo que estás buscando.

Ahora que si tienes curiosidad por conocer algunas bases de datos creadas para manejar cantidades de datos realmente masivos quizás quieras leer un poco de Cassandra (de Facebook), DynamoDB (de Amazon), BigTable (de Google) y Mongo DB.
a parte de poner unas PK en condiciones y de unos indices majetes, optimizas las selects todo lo que puedas, el volumen de datos que indicas no es que sea "excesivamente" alto.

Yo tengo una aplicación y de momento ya va por 1.200.000.000 resgistros aprox. y actualmente hay alrededor de 230 usuarios tirando de ella diariamente, tengo que decir que el modelo de datos es espectacular (no lo he hecho yo) y ayuda mucho pero la optimizacion de SP es fundamental. Cuidado con los like en los SP porque penalizan un cojon y parte del otro, sobre todo si se hacen sobre varchar o nvarchar.
Eso de que 30 millones de datos en una tabla no es demasiado es cuanto menos discutible. Con índices está claro que mejora, incluso salen resultados casi de inmediato. El problema es que no vas a crear un índice para cada columna (o al menos no deberías...). En el momento en que tengas que cruzar una tabla de 30 millones con otras 4 o 5 tablas que estén relacionadas, el rendimiento no va a ser bueno.

Actualmente trabajo para un proyecto en el que tenemos lecturas de luz de los clientes. Como podéis imaginas, hay varios millones de registros para esa tabla... y las consultas que tienen que cruzar con esas tablas, son bastante lentas... hablamos de lentitud varios segundos, desde luego la respuesta no es inmediata... a no ser que busquemos por los índices que es bastante rápida. Pero en nuestro caso, podemos hacer búsquedas por varios campos de esa tabla y por campos que están en otras tablas con las que se cruza...

Respuesta inmediata, para mi, complicado.

Por cierto, en mongoDB también hay indices y demás, pero como no es relacional, obviamente no hay PK hacia otras tablas. La verdad es que la organización del modelo de datos en una BBDD no relacional cambia mucho con respecto a una relacional. A mi me sigue costando ver que muchas veces esa organización sea mejor, pero muchas veces, se mete todos los datos del tirón en el documento, es decir, en vez de separar en varias tablas, se mete todo el contenido en el mismo documento. Según explicaban los de mongo, puede parecer que es mala solución por la manera de pensar que tenemos, que vamos a tener datos repetidos muchas veces... pero que la memoria física hoy en día es barata (razón no les falta) y que hay que ir mas allá, pensar en cuantas veces actualizaríamos esos datos extras que metemos. Un ejemplo chorra, si tienes que organizar libros y autores, la alternativa natural es meter los autores en una tabla, los libros en otra y que esta últiam tenga un PK hacia los autores. En mongo se puede hacer así (sin PK como tal) o también añadir la información de los autores a los libros directamente. ¿Qué va a tener muchas veces los datos de un autor, pues sí. Pero si estamos guardando 3 campos de los autores, lo mismo nos merece la pena. ¿Que si hay que hacer un update hay que recorrer todos los libros para actualizar 100 veces el mismo autor?. Pues sí, ¿cuántas veces se actualizarán los registros de este catálogo?. Cambia mucho la menra de enfocar los problemas con una BBDD relacional o no relacional. Por ejemplo, nosotros hicimos una especie de blog y la recomendación fue que los comentarios de los post guardaran en ellos mismos el autor del comentario, en vez de organizarlo por fuera en otra tabla. Es curioso y un poco extraño :S

Saludos
aperitivo escribió:a parte de poner unas PK en condiciones y de unos indices majetes, optimizas las selects todo lo que puedas, el volumen de datos que indicas no es que sea "excesivamente" alto.

Yo tengo una aplicación y de momento ya va por 1.200.000.000 resgistros aprox. y actualmente hay alrededor de 230 usuarios tirando de ella diariamente, tengo que decir que el modelo de datos es espectacular (no lo he hecho yo) y ayuda mucho pero la optimizacion de SP es fundamental. Cuidado con los like en los SP porque penalizan un cojon y parte del otro, sobre todo si se hacen sobre varchar o nvarchar.


Coño, pero no tendrás esos 1.200.000.000 registros en UNA tabla, que es lo que estamos hablando. Obviamente en un modelo relacional de un aplicación empresarial puedes tener eso y más. Pero cuando operas lo haces sobre un subconjunto, no sobre los 1.200.000.000.

Por ejemplo, yo que he trabajado en proyectos para un par de bancos, cuando quieren generar un informe que implica consultar mil historias, se hace de forma asíncrona. El tío pide el informe y tiene un apartado en la intranet en plan "mis peticiones" en el que le aparece "en curso" y luego cuando está preparado ya le aparece en estado "listo". Los informes se generan encolando las peticiones de forma que no haya chorrocientas peticiones simultáneas y crujas la BD, y desde que el tío lo pide a que lo tiene pueden pasar 5-10min (informes tochos) o incluso un día, ya que los informes MUY tochos con información de todo el año fiscal para varios clientes a veces se generan mediante procesos batch por la noche cuando los sistemas están más descargados.
redscare escribió:
Coño, pero no tendrás esos 1.200.000.000 registros en UNA tabla, que es lo que estamos hablando. Obviamente en un modelo relacional de un aplicación empresarial puedes tener eso y más. Pero cuando operas lo haces sobre un subconjunto, no sobre los 1.200.000.000.


Una tabla con 1.200.000.000 registros en una tabla principal que se tratan online, es decir, algo así como "operaciones vigentes".

Sacar operaciones de estadística anuales, son informes que fácilmente pueden tardar 5 ó 6 días en hacerse.

El SGBD es Oracle.
11 respuestas