Avantages et Inconvénients de l'utilisation de MongoDB à la place de MS SQL Server
Je suis nouveau sur le monde NoSQL et de la pensée de remplacer mon MS Sql Server base de données MongoDB. Ma demande (écrite .Net C#) interagit avec des Caméras IP et des enregistrements de méta-données pour chaque image provenant de la Caméra, dans la Base de données MS SQL. En moyenne, je suis de l'insertion sur 86400 d'enregistrements par jour pour chaque caméra et dans l'actuel schéma de base de données, j'ai créé table séparée pour séparer les images de la Caméra, par exemple Camera_1_Images, Camera_2_Images ... Camera_N_Images. Une seule image disque se compose de métadonnées simples info. comme AutoId, Chemin d'accès, CreationDate. Pour ajouter plus de détails à la présente, ma candidature initie le processus distinct (.exe) pour chaque appareil et chaque processus insère 1 enregistrement par seconde relative de la table dans la base de données.
J'ai besoin de suggestions de (MongoDB) experts sur les préoccupations suivantes:
-
de dire si MongoDB est bon pour la tenue de ces données, qui finira par être vérifiés à des intervalles de temps (par exemple, de récupérer toutes les images d'un appareil photo entre une heure précise)? Toutes les suggestions sur le Document de Base de la conception d'un schéma pour mon cas?
-
De ce que devraient être les spécifications du serveur (CPU, RAM, Disque)? toute suggestion?
-
Devrais-je envisager de Fragmentation/Répétition de ce scénario (tout en tenant compte de la performance dans l'écriture pour synchroniser les jeux de réplicas)?
-
Existe-il des avantages de l'utilisation de plusieurs bases de données sur la même machine, de sorte que la base de données permettra de garder des images de la journée pour toutes les caméras, et le second sera utilisé pour archiver jour précédent images? Je pense à en ce qui concerne le fractionnement du lit et écrit sur des bases de données distinctes. Parce que toutes les demandes de lecture peut être servi par seconde base de données et écrit à la première. Un profit ou pas? Si oui, alors une idée pour s'assurer que les deux bases de données sont synchronisées toujours.
Toutes les autres suggestions sont les bienvenues merci.
- stackoverflow.com/questions/1476295/...
- developer.olery.com/blog/goodbye-mongodb-hello-postgresql
- Surpris de voir un subjective de la question comme cela pas voté pour la fermeture. mais question de bien.
Vous devez vous connecter pour publier un commentaire.
Je suis moi-même un démarreur sur les bases de données NoSQL. Donc, je réponds à ce au détriment de la des voix, mais il sera d'une grande expérience d'apprentissage pour moi.
MongoDB être un document orienté db, il est bon à l'interrogation dans un agrégat (vous l'appelez document). Puisque vous êtes déjà stockage de chaque caméra de données dans sa propre table, dans MongoDB, vous disposerez d'une collection créé pour chaque caméra. Voici comment vous effectuez de la plage de dates des requêtes.
Toutes les bases de données NoSQL sont construits pour scale-out sur le matériel de base. Mais par la façon dont vous avez posé la question, vous pensez peut-être de l'amélioration de la performance par de la généralisation de la. Vous pouvez commencer avec une machine et à mesure que la charge augmente, vous pouvez continuer à ajouter plus de serveurs (mise à l'échelle-out). Vous n'avez besoin de planifier et d'acheter un haut de gamme serveur.
MongoDB les verrous de l'ensemble de la db pour une seule écriture (mais les rendements pour d'autres opérations) et est conçu pour les systèmes qui ont plus de lectures que de l'écrit. Donc, cela dépend de la façon dont votre système est. Il existe de multiples façons de la fragmentation, et doit être spécifique au domaine. Une réponse générique n'est pas possible. Cependant, certains exemples peuvent être donnés, comme celui de la fragmentation, par la géographie, par les branches etc.
Également lire Un anglais simple introduction au Théorème CAP
Mis à jour avec de réponse pour le commentaire sur la fragmentation
En fonction de leur la documentation, Vous devriez envisager le déploiement d'une fragmenté cluster, si:
Basé sur le dernier point, oui. L'auto-partage est intégrée à l'échelle de l'écrit. Dans ce cas, vous avez un verrou en écriture par éclat, pas par base de données. Mais le mien est une réponse théorique. Je vous suggère de prendre de la consultation de 10gen.com groupe.
Ce quiestion est trop subjectif pour me répondre. Par expérience personnelle, avec de nombreux SQL solutions (ironiquement pas MS SQL), je dirais qu'ils sont à la fois tout aussi bien, si c'est bien fait.
Aussi:
Dépend de trop de variables que vous seul connaissez, cependant un petit cluster de matériel de base fonctionne très bien. Je ne peux pas vraiment donner une réponse factuelle à cette question et il sera de votre test.
Comme pour un schéma je voudrais aller un document de la structure:
Cela devrait être assez facile à mantain et la mise à jour tant que vous n'êtes pas l'incorporation de beaucoup plus profond car alors il pourrait devenir un peu de douleur, cependant, cela dépend de vos requêtes.
Non seulement cela, mais cela devrait être bon pour la fragmentation, puisque vous disposez de toutes les données dont vous avez besoin dans un document, si vous étiez à tesson
_id
vous pourriez probablement obtenir la configuration parfaite ici.Éventuellement, de nombreuses personnes pensent qu'ils ont besoin d'éclat alors qu'en réalité, ils ont juste besoin d'être plus intelligent dans la façon de concevoir la base de données. MongoDB est très en forme libre donc il ya beaucoup de façons de le faire mal, mais cela étant dit, il ya aussi beaucoup de façons de dong droit. Personnellement, je voudrais garder la fragmentation à l'esprit. La réplication peut être très utile aussi.
Même si MongoDBs verrou d'écriture est sur le niveau de DB (actuellement) je dirais: Non. Le droit de la structure du document et le droit de fragmentation/réplication (si nécessaire) doit être en mesure de les traiter dans un seul document, en fonction de la collection(s) sous un seul DB. Non seulement cela, mais vous pouvez diriger les écritures et lectures à l'intérieur d'un cluster certains serveurs afin de créer une simultanéité entre certaines machines dans votre cluster. Je voudrais promouvoir l'utilisation correcte des MongoDBs simultanéité dispose de plus de DB séparation.
Modifier
Après la lecture de la question encore une fois j'ai omis de ma solution que vous insérez 80k+ les images de chaque caméra, un jour. En tant que tel, au lieu de l'option intégrée en fait, je peux faire une ligne par image dans une collection appelée
images
et puis uncamera
de collecte et d'interroger les deux comme vous le feriez dans SQL.La fragmentation, la
images
collection devrait être tout aussi facile surcamera_id
.Aussi, assurez-vous que vous prenez de travail mis en examen avec votre serveur.
MongoDB peut le faire. Pour de meilleures performances, vous pouvez définir un index sur votre champ de temps.
Je pense que la RAM et le Disque serait important.
sharding
àscale out
, vous devriez envisager une plus grande taille de disque de sorte que vous pouvez stocker toutes vos données.Je ne sais pas beaucoup de caméras de vous avez, même 1000 insertions/seconde avec un total de 1000 caméras doivent toujours être facile à MongoDB. Si vous êtes relatives à la performance de l'insert, je ne pense pas que vous avez besoin de faire sharding(à l'Exception de la taille des données sont trop gros, que vous avez à les séparer en plusieurs machines).
Un autre problème est la lecture de la fréquence de votre application. Il est très élevé, alors vous pouvez envisager de fragmentation ou de la réplication ici.
Et vous pouvez utiliser (timestamp + camera_id) que votre clé de sharding si votre requête sur une seule caméra dans un intervalle de temps.
Vous pouvez séparer le tableau en deux collections(
archive
etcurrent
). Et index du jeu uniquement surarchive
si vous n'requête date dearchive
. Sans les frais de création de l'index, lecurrent
collection devrait bénéficier avec insert.Et vous pouvez écrire un programme quotidien pour vider les
current
données dansarchive
.