Nous avons une base de données d'entreprise à très grande échelle. Dans le cadre de notre modèle commercial, tous les utilisateurs Web accèdent à nos serveurs Web en même temps chaque mois, ce qui, à son tour, martèle notre boîte sql. Le trafic est très dense et continue de croître à mesure que l'entreprise grandit. l'optimisation sql proc a été effectuée et le matériel a déjà été étendu à un niveau très élevé.
Nous cherchons à partager la base de données maintenant pour nous assurer que nous pouvons gérer la croissance de l'entreprise et les charges futures.
Nous avons décidé quelles données particulières doivent être partagées. Il s'agit d'un sous-ensemble de notre base de données qui est très utilisé.
Cependant, ma question concerne les données non partagées qui sont communes / universelles. Un exemple de données comme celle-ci peut être une table d'inventaire par exemple ou éventuellement une table Employé, une table utilisateur, etc.
Je vois deux options pour gérer ces données communes / universelles:
1) conception 1 - Placer les données communes / universelles dans une base de données externe. Toutes les écritures auront lieu ici. Ces données seront ensuite répliquées dans chaque fragment, permettant à chaque fragment de lire ces données et de se joindre à ces données dans les procs t-sql.
2) conception 2 - Donnez à chaque fragment sa propre copie de toutes les données communes / universelles. Laissez chaque partition écrire localement dans ces tables et utilisez la réplication de fusion SQL pour mettre à jour / synchroniser ces données sur toutes les autres partitions.
préoccupations concernant la conception # 1
1) Problèmes transactionnels: si vous avez une situation dans laquelle vous devez écrire ou mettre à jour des données dans un fragment puis écrire / mettre à jour une table commune / universelle dans 1 proc stocké par exemple, vous ne pourrez plus le faire facilement. Les données existent désormais sur des instances et bases de données SQL séparées. Vous devrez peut-être impliquer MS DTS pour voir si vous pouvez encapsuler ces écritures dans une transaction car elles se trouvent dans une base de données distincte. Les performances sont une préoccupation ici et des réécritures possibles peuvent être impliquées pour les procs qui écrivent sur des données fragmentées et communes.
2) une perte d'intégrité référentielle. Impossible de réaliser l'intégrité référentielle croisée de la base de données.
3) Recodage de grandes zones du système afin qu'il sache écrire des données communes dans la nouvelle base de données universelle mais lire les données communes des fragments.
4). augmentation des déplacements dans la base de données. Comme n ° 1 ci-dessus, lorsque vous rencontrez une situation dans laquelle vous devez mettre à jour des données fragmentées et des données communes, vous allez effectuer plusieurs allers-retours pour y parvenir, car les données sont désormais dans des bases de données distinctes. Une certaine latence du réseau ici, mais je ne suis pas autant préoccupé par ce problème que ci-dessus 3.
préoccupations concernant la conception # 2
Dans la conception # 2, chaque fragment obtient sa propre instance de toutes les données communes / universelles. Cela signifie que tout le code qui joint ou met à jour les données communes continue de fonctionner / s'exécuter comme il le fait aujourd'hui. Il y a très peu de recodage / réécriture nécessaire de la part de l'équipe de développement. Cependant, cette conception dépend complètement de la réplication de fusion pour garder les données synchronisées sur tous les fragments. les dbas sont hautement qualifiés et sont très préoccupés par le fait que la réplication de fusion ne puisse pas gérer cela et que la réplication de fusion échoue, que la récupération à partir de cet échec ne soit pas importante et puisse nous affecter très négativement.
Je suis curieux de savoir si quelqu'un a opté pour l'option de conception # 2. Je suis également curieux de savoir si je néglige une troisième ou une quatrième option de conception que je ne vois pas.
Merci d'avance.