web-dev-qa-db-fra.com

Mongodb est-il le bon choix dans mon cas?

Je vais construire mon premier vrai projet dans Rails qui consistent dans une application Web composée de 3 parties principales:

  • La partie statique où aucune base de données n'est utilisée
  • La pièce d'enregistrement de l'utilisateur qui nécessitera une base de données et je peux utiliser MySQL car chaque ligne d'utilisateur aura les mêmes champs.
  • "L'application" où les utilisateurs pourront créer, organiser, éditer ... articles dans les collections et les partager avec d'autres utilisateurs

Il y aura plusieurs types d'éléments et chacun aura des options différentes, par exemple, je peux avoir des éléments "vidéo" avec les options suivantes:

  • identifiant
  • identifiant d'utilisateur
  • collection_id
  • titre
  • plate-forme (si intégrée)
  • uRL (si intégré)
  • nom de fichier (si hébergé sur mon application)
  • taille de fichier (ID hébergé sur mon application)

et éléments "Carte":

  • identifiant
  • identifiant d'utilisateur
  • collection_id
  • titre
  • plate-forme (Google Maps, Bing Maps ...)
  • emplacement
  • uRL
  • taille de la carte

Comme vous pouvez les utilisateurs, je peux utiliser MySQL pour les articles, la flexibilité de MongoDB peut être utile car chaque élément peut avoir besoin d'options différentes, puis un autre article

Jusqu'à présent, j'ai toujours utilisé PHP et mysql (toujours sur l'hébergement partagé pour de petits projets) et l'évolutivité est un mot totalement nouveau pour moi.

J'ai le temps d'apprendre mais j'aimerais pouvoir faire quelque chose de concret dans quelque chose comme 1 mois.

J'ai beaucoup lu sur Mongodb et NosqL VS RDMS et MySQL et après avoir essayé de le faire, je voudrais dire que j'aime comment MongoDb fonctionne: pas de tables, pas de lignes et de ses documents Json comme:

  • Dans ma situation, que seriez-vous possible? Pourquoi?
  • À propos de l'évolutivité Il peut y avoir des problèmes avec MongoDB? Si oui quand (en termes de format de db) et que ces problèmes ralentissent considérablement mon application?

EDIT: Comment l'application fonctionnera

Depuis beaucoup, c'est comme ça que j'aimerais que l'application fonctionne:

  1. Un utilisateur s'inscrire
  2. Il est connecté
  3. Il crée sa première collection iside qu'il peut créer des articles infinis
  4. Les éléments sont de type divers et chaque type besoin de données différentes à enregistrer dans la base de données et le type d'éléments peut être ajouté ou modifié.

Les utilisateurs peuvent créer d'autres collections et articles à l'intérieur.

Nous avons donc un crud pour les collections et les articles à l'intérieur d'eux et chaque collection/article est appelé utilisateur spécifique.

Le principal problème avec MySQL est qu'il n'a pas de schéma flexible, il existe un moyen de résoudre ce problème (une solution de contournement?)?

En pensant à NosqL Le seul doute que j'ai concerne la jointure, par exemple, compte tenu d'une certaine couleur que je souhaite récupérer des données liées à l'utilisateur avec ID = le champ user_id de la collection

Edit: idée de continuer à utiliser mysql

Créez un champ dans la table "Articles" avec des paramètres facultatifs, chaque paramètre divisé par un | ou un autre symbole.

Ensuite, je vais économiser quelque part une structure de chaque élément Paramètres facultatifs, par exemple, le type d'élément "Notes" nécessite deux paramètres facultatifs "couleur" et "strange_setting", lorsque je reçois les données de MySQL, je diviserai le champ pour des paramètres facultatifs dans un Array sachant que le premier élément du tableau est pour "couleur" et ainsi de suite.

Qu'est-ce que tu penses? Il y a un problème avec cette solution? Avez-vous d'autres idées?

9
Matteo Pagliazzi

Nous ne pourrons peut-être pas vous aider avant de nous dire ce que vous avez l'intention de faire avec l'application. Les bases de données relationnelles sont bonnes pour certaines choses et les bases de données NOSQL sont bonnes pour les autres.

Comme quelqu'un m'a dit une fois ici.

la partie relationnelle d'un dB relationnel est beaucoup plus optimisée que d'autres parties

Cela signifie que vous pouvez également utiliser une base de données relationnelle également si cela semble correspondre à vos cas d'utilisation. Ne pas simplement aller de l'avant avec Mongodb en raison de sa flexibilité/de sa évolutivité. C'est la première ligne sur MongoDB sur Wikipedia:

MongoDB (de "Humongous") est un système de base de données NOSQL orienté open source.

Avez-vous vraiment l'intention d'utiliser un dB orienté sur le document? S'il y a une graphique dans vos cas d'utilisation, vous pouvez très bien aller pour une base de données graphique comme Neo4j. Ou vous pouvez très bien utiliser le meilleur de SQL et NOSQL ensemble comme certaines personnes.

BTW, je fais aussi un projet dans lequel j'utilise les meilleures parties de SQL et de NOSQL.

Edit: Je dis à nouveau:

Découvrez le Neo4J vs Hadoop section sur this article. Ça dit:

En principe, Hadoop et d'autres magasins de valeurs de clé sont principalement concernés par des structures de données relativement plats . C'est-à-dire qu'ils sont extrêmement rapides et évolutifs en ce qui concerne la récupération d'objets simples, comme des valeurs, des documents ou même des objets.

Se référant au même article, avez-vous vraiment besoin d'une structure de données plate pour laquelle vous allez pour MongoDB? Cela dépend finalement de vos cas d'utilisation détaillés, comment les étapes 3 et 4 vont être effectuées.

De plus, vous voudrez peut-être renvoyer ces questions:

https://stackoverflow.com/questions/2124274/MONGODB-Qu-Qu-Qu-à-nkow-bore-utant

https://stackoverflow.com/questions/1476295/Quand-o-Utiliser-mongodb-or-Outher-Document-oriented-Database-systems

( Consultez la réponse supérieure/sélectionnée de la deuxième question à coup sûr. Vous êtes dans ce dilemme que cela pourrait simplement résoudre.)

Je suppose que ces questions ont toutes les informations que vous vouliez savoir. En fin de compte, c'est vous qui devra décider si c'est mongodb ou autre chose, nous pouvons simplement recommander. Les seules personnes connaissant vos affaires d'utilisation détaillées sont vous et votre équipe.

Modifier à nouveau (pour la partie MySQL): Comme je l'ai compris, vous prévoyez de stocker quelque chose dans la DB et de les séparer à travers un séparateur. Cela présente 2 problèmes:

  1. Vous devez également gérer toute entrée qui aura le séparateur.
  2. La partie de stockage relationnelle d'une base de données relationnelle est beaucoup plus optimisée que la partie correspondante à chaîne. Je n'irais pas pour un schéma dans lequel j'ai besoin de faire des chaînes correspondant dans une base de données pour obtenir un résultat spécifique. Encore une fois je suis stressant:

    la partie relationnelle d'un dB relationnel est beaucoup plus optimisée que certaines autres parties (par exemple.

  3. N'utilisez pas d'attributs multiples. Les gens les redoutent généralement.
10
c0da

Je vois beaucoup cette question. Il semble toujours être considéré comme/ou. MongoDB est un excellent nouvel outil. Il semble également parfois comme l'outil brillant pour tout et qui peut être un mauvais choix de mon expérience.

Je pense que la meilleure combinaison est définitivement à la fois et je voudrais vous féliciter de votre approche d'utiliser MyLSQL pour certaines pièces, telles que les utilisateurs, mais utilisez mongodb pour d'autres parties, car je pense que l'authentification et l'autorisation sont les mieux faites avec MySQL et il y a une tonne d'exemples et de modules qui le font vraiment bien.

Pour le "grand nombre d'articles", c'est là que vous souhaitez envisager d'utiliser MongoDB si votre volume est élevé, et/ou surtout des lectures et/ou des données non structurées.

Je conseillerais de ne pas baser votre décision sur la flexibilité des schémas de Mongo. SQL et SQL-SCHEMAS sont découlés de la nécessité d'avoir des données structurées et de pouvoir effectuer des calculs et des transformations uniquement possibles avec une telle structure. J'ai appris cela de 5 ans de travail dans un rôle d'entrepôt de données. Je ne serais que regarder à Mongobd pour la question de la performance. Si vous êtes ou attendez un volume élevé d'utilisateurs et de demandes, dites 100 000 utilisateurs et 20 demandes une seconde, j'utiliserais mongodb, sinon j'essaierais de rester avec SQL. Dans de nombreux cas, j'utiliserais MySQL pour un volume faible, puis, en tant que volume, revenu et infrastructure qui le supportez, passez à Oracle avant de mélanger à MongoDB. Je conviens que vous ne devriez pas essayer de traiter des problèmes de volume avant de les expérimenter, cependant, si vous avez une idée juste d'où vous vous dirigez et que vous ne voulez pas ré-écrire des choses à mi-chemin, il a beaucoup de sens à Choisissez les bonnes technologies au poste. N'oubliez pas que si vous avez vraiment ce volume élevé, il existe une énorme quantité d'options et de technologies à tous les niveaux de la pile que vous chercherez à utiliser.

Il y a des données inconvénients pour des données vaguement structurées. J'utilise l'analogie du parking ici. Aucune ligne de division n'est idéale pour les 3 premières voitures qui pénètrent, mais comme plus d'entrées de voitures, beaucoup de désorganisation commence à se produire et à essayer de se garer ou de compter facilement les voitures et de garder les voies libres devient un cauchemar. Organiser cela prend du travail à l'avant - marquage des lignes et des diviseurs et des flux de trafic, etc. Mais il est payé. Parfois, les choses changent bien sûr (les voitures deviennent plus grandes) et vous devez faire des changements - des lignes repeintes. De plus, il suffit de standard pour repeindre et entretien annuel.

L'aspect de la conception de schéma sera probablement le plus gros obstacle des utilisateurs de MySQL traditionnels. Je pense que la page Mongodb sur la conception de schéma aide à cela. Mon dernier point est que chaque technologie que vous ajoutez dans le mélange ajoute la complexité. Il y a souvent d'énormes avocats pour tout élément donné qui vous dira "avoir" pour l'utiliser, mais j'ai constaté qu'un très gros facteur est juste combien de pièces il y a. Cela implique de plus de points d'échec plus possibles et la plupart d'une base de connaissances nécessaire pour que quiconque ait à savoir travailler dessus.

fyi Rick Obsorne a un joli incroyable diagramme de comparaison c'est assez unique!

8
Michael Durrant

Je vois beaucoup d'arguments valides ici pour Nosql vs mysql. Un lien manquant est à propos de l'échelle: si vous voulez vraiment échelle et que vous voulez le faire avec une base de données dans la maison, vous aurez besoin de nombreuses connaissances sur les bases de données. Il y a trop d'histoires d'horreur là où les gens ont échoué à essayer de mettre en œuvre un système qui évoluera infiniment.

Si vous choisissez vraiment d'aller à la route NOSQL (et êtes prêt à prendre les coûts qui l'accompagnent - comme aucune jointure), considérez-vous AWS dynamodb (http://aws.amazon.com/dynamodb/). Ici, vous pouvez oublier la partie intégrante de la base de données et concentrez-vous sur votre demande. Bonne chance.

Disclaimer: Je suis un développeur dans l'équipe AWS Dynamodb, mais je crois vraiment à notre produit. Essayez-le :)

Donc, votre conception permet d'économiser dans votre base de données deux types d'objets différents:

  • Objet utilisateur (qui ont toujours les champs).
  • Les objets apps (qui peuvent avoir des champs différents). Une application appartiendra à un utilisateur uniquement.

Une collection pourrait ou non être faite comme un objet différent, comme c'est simplement une étiquette pour grouper différentes applications. Pour des raisons d'argumentation, disons qu'il n'y a pas de collections et d'utilisateurs ne sont qu'une liste d'applications.

Bien que je pense soit réalisable sur MySQL, dans Mongodb, vous aurez une plus grande flexibilité en termes de structure des objets d'application, et il créera probablement plus naturellement votre représentation dans la base de données, ce qui rend le code plus simple.

Dans MySQL, vous rencontrerez des problèmes avec différents formats pour différentes applications, mais cela est possible. Quelques idées:

  • Vous pouvez créer une table intermédiaire avec toutes les informations courantes entre tous les objets (ID, User_id, Titre, etc.), puis le type, vous pouvez donc la rechercher sur une autre table avec uniquement les champs non courants de ce format (par exemple Nom de fichier et fichier_size pour les fichiers). Vous devrez créer une table différente pour chaque format différent. Si les deux tables sont indexées par App_id (clé primaire), elle sera suffisamment rapide, car l'accès à une table par une valeur indexée est rapide.
  • Vous pouvez encoder les données dans un format et stocker normalisés. E.G., encode les données non communes dans JSON en tant que chaîne et stockez-la sur un champ Varchark. Soyez prudent avec la taille de ce champ afin que vous ne manquiez pas de l'espace. Le format peut être complexe (JSON) ou simple (juste des valeurs séparées par des virgules)
  • Vous pouvez créer différents champs "génériques", quelque chose comme Int1, INT2, STR1, STR2 et définir ce STR1 pour un type d'application est "Nom de fichier" pendant qu'un type différent pourrait être "Emplacement".

Sur MongoDB, cela pourrait être aussi simple que d'utiliser deux collections de MongoDB, une pour les utilisateurs et une autre pour les applications. En supposant une sorte de limite (ce qui n'est pas le cas, comme vous l'avez décrit, mais simplement pour dire), vous pouvez même stocker les applications à l'intérieur de l'objet utilisateur, en tant que liste. Le stockage et la récupération des données sont plus naturels, car vous pouvez stocker tout type d'objet, quel que soit les champs. Vous pouvez rechercher par user_id pour obtenir toutes les applications appartenant à un utilisateur. Sur MongoDB, vous perdez de toute façon la possibilité de faire des questions de jointure, mais dans ce cas, je pense que les requêtes de base vont récupérer l'utilisateur et récupérer les applications liées à l'utilisateur. Si vous envisagez de faire beaucoup de choses comme "Donnez-moi les utilisateurs qui ont plus de deux collections avec trois applications ou moins sur chacun", vous devrez le générer non comme une requête de jointure, mais comme processus de code, et sera moins naturel que dans une base de données relationnelle et peut prendre plus de temps pour traiter. Si vous souhaitez rechercher des paramètres (par exemple, donnez-moi toutes les applications appartenant à un utilisateur particulier; donnez-moi toutes les applications de type X), c'est assez facile sur MongoDb et que vous n'avez pas besoin d'utiliser des jointures.

Je ne suis pas sûr du soutien de MongoDB sur des rails. Je l'utilise dans Python et JavaScript.

EDIT: Ajout du commentaire sur le temps lors de l'accès à deux tables et une autre option MySQL

1
Khelben

Je dirais utiliser la technologie que vous connaissez le mieux, surtout s'il s'agit d'un véritable projet et que vous souhaitez le repousser rapidement. Utiliser MySQL et Mongo viendront tous les deux avec ses propres avantages et maux de tête. Ayant travaillé avec les deux, j'ajouterais également qu'il n'est pas très difficile de migrer de MySQL à Mongo si vous suivez de bons directeurs de conception.

Ayant cela dit, une bonne raison d'aller avec Mongodb dans votre cas est vos données. Comme vous l'avez mentionné, vous aurez plusieurs types d'entrée différents pour vos collections: carte, vidéo, etc. Si vous deviez mettre en œuvre cela à l'aide de RDBMS, vous avez 3 approches:

  • tableau par type: Chaque table contient des colonnes spécifiques à chaque type d'objets.

    Inconvénients : n requête à rechercher dans tous les types de données.

    Avantages : bon OO conception, facile à maintenir

  • table simple: une énorme table contenant tout attribut possible pour tous les types, avec la plupart d'entre eux null pour une entrée particulière

    Inconvénients : Changer à n'importe quel objet nécessitera une table modifiée, douloureuse une fois que la table devient grande. Difficile à maintenir.

    Avantages : Facile à mettre en œuvre.

  • table principale avec méta-data: vous avez une table unique avec les attributs principaux, indiquez le titre, les dates et une table de métadonnées avec paires de clés pour des attributs supplémentaires.

    Inconvénients : Deux requêtes pour obtenir toutes les données pour un seul objet.

    Avantages : extrêmement flexible, pas très difficile à mettre en œuvre.

J'ai déjà utilisé chacune de ces approches et je peux dire qu'aucun est aussi naturel de travail avec Mongo. Vos données vont probablement regarder quelque chose comme ceci:

{_id:"collection1",
 name:"My first Collection",
 owner: "user123243342",
 entries: [
    {type:"video",
     url: "http://www.youtube.com/234324",
     tags: ["roadtrip", "fun", "camera"]
     },
    {type:"map",
     coordinates: [LOC: [38, –102], LOC: [43, –33], LOC: [228, –102]],
     description: "Road trip to nowhere",
 ]
}

Mais vous n'aurez pas vraiment à vous soucier de la conception du schéma, car les objets de votre domaine peuvent être directement persistés comme tels. MongoDB est essentiellement votre magasin d'objets que vous pouvez interroger contre.

Remarqué J'ai laissé une discussion sur la comparaison de performance entre MySQL et MongoDB. Pendant que vous devriez toujours garder la performance à l'esprit, vous ne serez pas en mesure de décider efficacement, à moins que vous sachiez le modèle d'accès aux données. Tout bon projet passera probablement dans quelques itérations de refactorisation au fur et à mesure de la croissance et de nouveaux défis émerge. Ne vous inquiétez pas de la performance pré-maturel et choisissez l'outil que vous connaissez le mieux et commencez à coder.

Edit

Pour répondre à votre question spécifique à l'aide de MySQL et à garder des attributs dans le même champ à l'aide de "|". Ne fais pas ça. Cette approche vous donnera plus de problème que cela ne résout. Tout d'abord, vous ne pourrez pas interroger contre des attributs individuels à l'aide de MySQL. Deuxièmement, il ajoute trop de complexité à votre couche d'accès aux données. Utilisez le type par table ou l'approche méta-données à la place. Si vous avez travaillé avec WordPress avant, il utilise l'approche méta-données:

  • table utilisateur + USEMETA pour l'utilisateur
  • post Table + PostMeta Post

Cela rend la structure de données extrêmement flexible et toujours interrogée avec une vitesse raisonnable.

1
ltfishie

L'article ci-dessous fournit de bons résultats comparant MySQL et Mongodb en termes de sélection, de récupération et d'insertion, en considérant la quantité de données dans la base de données et la quantité de données récupérées. Les résultats présentent une excellente performance pour MongoDB concernant les "inserts", mais les autres cas mysql gagne. Voir ci-dessous:

http://www.morevs.ro/mysql-vs-mongodb-performance-benchmark/

J'ai eu une expérience en utilisant mongodb que je pense que c'était une bonne solution. Je l'ai utilisé pour insérer des milliers de collections tous les jours. Combiné à la solution solrienne (solution de cache, mise à jour une fois par jour), je peux récupérer les données de MongoDB par l'ID de collecte si nécessaire, donc je n'ai pas besoin de sélectionner à la volée. Ainsi, compte tenu de vous faire face à de nombreux inserts et de ne pas avoir besoin de vous soucier de choisir et de chercher à chercher, MongoDB pourrait être une bonne idée, cela dépend de chaque cas et de faire une bonne analyse.

0
Rogerio Hilbert