Tenemos una base de datos a nivel empresarial de gran escala. Como parte de nuestro modelo de negocio, todos los usuarios web acceden a nuestros servidores web al mismo tiempo cada mes, lo que a su vez afecta nuestro cuadro sql. El tráfico es muy pesado y continúa creciendo a medida que crece la empresa. Se ha realizado la optimización del proceso sql y el hardware ya se ha ampliado a un nivel muy alto.
Estamos buscando fragmentar la base de datos ahora para garantizar que podamos manejar el crecimiento de la empresa y las cargas futuras.
Hemos decidido qué datos particulares se deben fragmentar. Es un subconjunto de nuestra base de datos que es altamente utilizado.
Sin embargo, mi pregunta es sobre los datos no fragmentados que son comunes / universales. Un ejemplo de datos como este puede ser una tabla de inventario, por ejemplo, o posiblemente una tabla de empleados, una tabla de usuarios, etc.
Veo dos opciones para manejar estos datos comunes / universales:
1) diseño 1 - Coloque los datos comunes / universales en una base de datos externa. Todas las escrituras ocurrirán aquí. Estos datos luego se replicarán en cada fragmento permitiendo que cada fragmento lea estos datos y se unan internamente a estos datos en procesos t-sql.
2) diseño 2: dé a cada fragmento su propia copia de todos los datos comunes / universales. Deje que cada fragmento escriba localmente en estas tablas y utilice la replicación de combinación sql para actualizar / sincronizar estos datos en todos los demás fragmentos.
preocupaciones sobre el diseño # 1
1) Problemas transaccionales: si tiene una situación en la que debe escribir o actualizar datos en un fragmento y luego escribir / actualizar una tabla común / universal en 1 proceso almacenado, por ejemplo, ya no podrá hacerlo fácilmente. Los datos ahora existen en instancias y bases de datos SQL separadas. Es posible que necesite involucrar a MS DTS para ver si puede ajustar estas escrituras en una transacción, ya que están en una base de datos separada. El rendimiento es una preocupación aquí y las posibles reescrituras pueden estar involucradas para procesos que escriben en datos fragmentados y comunes.
2) una pérdida de integridad referencial. No es posible hacer integridad referencial cruzada de bases de datos.
3) Recodificar grandes áreas del sistema para que sepa escribir datos comunes en la nueva base de datos universal pero lea datos comunes de los fragmentos.
4) aumento de los viajes a la base de datos. Al igual que en el punto 1 anterior, cuando se encuentra con una situación en la que debe actualizar datos fragmentados y datos comunes, realizará múltiples viajes de ida y vuelta para lograr esto, ya que los datos ahora están en bases de datos separadas. Aquí hay latencia de red, pero no estoy tan preocupado por este problema como los 3 anteriores.
preocupaciones sobre el diseño # 2
En el diseño # 2, cada fragmento obtiene su propia instancia de todos los datos comunes / universales. Esto significa que todo el código que se une o actualiza datos comunes continúa funcionando / ejecutándose tal como lo hace hoy. Se necesita muy poca grabación / reescritura del equipo de desarrollo. Sin embargo, este diseño depende completamente de la replicación de fusión para mantener los datos sincronizados en todos los fragmentos. los dbas son altamente calificados y están muy preocupados de que la replicación de fusión no sea capaz de manejar esto y si falla la replicación de fusión, la recuperación de esta falla no es excelente y podría impactarnos muy negativamente.
Tengo curiosidad por saber si alguien se ha ido con la opción de diseño # 2. También tengo curiosidad por saber si estoy pasando por alto una tercera o cuarta opción de diseño que no veo.
gracias de antemano.