Se puede interactuar con una BD simultaneamente diferentes personas y a la vez?

Iniciado por digimikeh, 6 Abril 2020, 18:29 PM

0 Miembros y 1 Visitante están viendo este tema.

digimikeh

Hola!

Antes mis programas eran con bases de datos locales sqlite, donde yo al iniciar el programa volcaba toda la informacion de la base de datos en la memoria (en vectores) y luego trabajaba directamente con tales vectores en vez de estar interactuando constantemente con la base de datos, luego tenia un boton "guardar" el cual subia todos los cambios a la BD...



Ahora estoy haciendo un programa cuyo objetivo es agregar personas a una tabla del programa, la cosa es que cada registro debe quedar guardado en una tabla en la base de datos mysql en un servidor remoto.

Ej:

Jorge en España a las 16:00 hrs UTC ingresa una persona a la bd
La tabla del programa de Jorge se actualiza con su registro correctamente

Jaime en Argentina a las 16:01 ingresa otra persona a la bd..
La tabla del programa de Jaime se actualiza con su registro correctamente

Como es que Jorge y Jaime actualizan sus tablas respectivamentes para que muestren ambos registros?... en teoria se como se hace, pero no se si es ortodoxo, se me ocurre que cada vez que uno de los dos guarde un registro se rellenen las tablas de los programas directamente de la base de datos y no de un vector interno del programa como lo hacia yo con sqlite ya que la informacion local de Jaime no seria la misma que la de Jorge..

Estara bien esto?

En el fondo para expresarme mejor, lo que necesito es que la tabla del programa sea una referencia de la tabla de la base de datos todo el tiempo, cada vez que se haga una operacion (agregar, modificar o quitar). que sean como espejos..

gracias
Dungeons & dragons;
dragons.Attack();

engel lex

por lo que dices cada quien altera su tabla, no hay ninguna colision


y si multiples personas pueden manejar la DB al mismo tiempo, claro, no son "al mismo tiempo", simplemente el motor de la DB realiza una operacion y luego la otra
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

digimikeh

Gracias por tu respuesta..

Lo que pasa es que la tabla local y la tabla de bd deben ser espejos una de otra, ya que Jaime tambien debe ver lo que ha ingresado Jorge al instante pero en su propio programa...

Literalmente es como si la tabla local se estuviera actualizando y nivelando con la de la bd, entonces mi duda es que eso va a traer harta carga si son muchos usuarios, no hay problemas para el motor de bd ?
Dungeons & dragons;
dragons.Attack();

engel lex

Cita de: digimikeh en  6 Abril 2020, 18:38 PM
Gracias por tu respuesta..

Lo que pasa es que la tabla local y la tabla de bd deben ser espejos una de otra, ya que Jaime tambien debe ver lo que ha ingresado Jorge al instante pero en su propio programa...

Literalmente es como si la tabla local se estuviera actualizando y nivelando con la de la bd, entonces mi duda es que eso va a traer harta carga si son muchos usuarios, no hay problemas para el motor de bd ?

si las 2 son espejo, entonces no hay mucho sentido de tener una tabla local a menos que realmente haya posibilidad de tener muchas operaciones offline (ya que me dices que se tiene que acceder a la tabla del otro usuario, offline solo empeora el problema), la tabla offline para rapida operacion usualmente es solo un reflejo en memoria, pero no una tabla real

cuantos llamas muchos usuarios? de cuantas operaciones por segundo hablamos?

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

#!drvy

Si lo que van a introducir/almacenar esos usuarios tiene la misma estructura, no es practico ni recomendado que cada usuario tenga su "propia tabla".

Lo que haces es usar una sola tabla y asociar cada registro a un usuario en concreto o en su defecto tener una base de datos exclusiva para el usuario.

Saludos

ThunderCls

MySQL soporta un maximo de conexiones concurrentes configurable desde los 60 y tantos a los 2000 y tantos (AWS). Eso significa que podrian estar esa cantidad de usuarios, a la misma vez, manipulando la base de datos de una forma u otra. El tema de colisiones como bien te han comentado es manejado por el propio motor de la base de datos y sus protocolos de control de concurrencia (locks, TPLP, DPP, TSO, etc ), el cual garantiza que no existan  problemas con transacciones concurrentes.
Por otra parte, el mecanismo que comentas de trabajar con todos los datos en memoria no es la mejor practica cuando se trabaja con sistemas distribuidos. La base de datos existe con el objetivo de tener la informacion centralizada y que todos los clientes tengan la ultima version de los datos cada vez que lo soliciten. Luego, por cuanto tiempo manejarias la informacion en la memoria de tu aplicacion antes de enviarla a la BD?, mientras no lo haces el resto de clientes no tendrian la informacion actualizada y quizas cuando te decidas a enviarla entre en conflicto con otro commit. Por otra parte esta la seguridad de la informacion, si tu aplicacion crashea o se cierra todos los datos que manejabas en memoria se perderian. Resumiendo, esa forma de proceder viola muchisimas buenas practicas y anula en si el objetivo de una BD para empezar.
Las BD existen para consultarlas y hacerle peticiones cada vez que necesites obtener informacion, ese es su objetivo y su metodo de funcionamiento, luego ya hay tecnicas de optimizacion de consultas, db caching, etc, pero esos son otros temas. A no ser que tu servidor MySQL este alojado en una PC con escasos recursos o tu sistema vea transacciones por el orden de los miles por minuto o segundo, no creo que tengas problemas. Para el tema de mantener en "cache" por llamarlo de alguna manera, los resultados de una consulta de la base de datos, auxiliate de los controles de tu aplicacion, utiliza tablas, listas, cajas de texto y todo lo que necesites para la permanencia de los resultados de tus consultas y la interaccion del usuario con ellos.
Igual con todo lo anterior no se si he respondido a tu pregunta
Suerte

-[ "...I can only show you the door. You're the one that has to walk through it." – Morpheus (The Matrix) ]-
http://reversec0de.wordpress.com
https://github.com/ThunderCls/

digimikeh

Vale, entonces si no entendí mal, no sería problema recargar la tabla local desde la db cada vez que ingrese/modifique/quite un registro.

Los usuarios finales seran al rededor de unos 20 promedio.
Entonces mejor me olvido del vector y almacenaje en la memoria por esta vez.
Dungeons & dragons;
dragons.Attack();

ThunderCls

Cita de: digimikeh en  7 Abril 2020, 04:07 AM
Vale, entonces si no entendí mal, no sería problema recargar la tabla local desde la db cada vez que ingrese/modifique/quite un registro.

Lo que sigo sin entender es la finalidad de tener una replica local de la BD remota, en mi opinion estas añadiendo una capa extra innecesaria en el flujo de trabajo, a no ser que evidentemente, el diseño de tu software asi lo requiera para otros fines. Cual es el objetivo de esta copia en tu caso especifico? Que necesitas de la BD local que no puedas usar de la remota?
-[ "...I can only show you the door. You're the one that has to walk through it." – Morpheus (The Matrix) ]-
http://reversec0de.wordpress.com
https://github.com/ThunderCls/

digimikeh

no tengo una bd local, es solo un widget de tabla, estoy usando Qt Creator, la tabla la uso para mostrar los datos de la bd..
Dungeons & dragons;
dragons.Attack();

ThunderCls

-[ "...I can only show you the door. You're the one that has to walk through it." – Morpheus (The Matrix) ]-
http://reversec0de.wordpress.com
https://github.com/ThunderCls/