Je vais construire mon premier vrai projet dans Rails qui consistent dans une application Web composée de 3 parties principales:
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:
et éléments "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:
EDIT: Comment l'application fonctionnera
Depuis beaucoup, c'est comme ça que j'aimerais que l'application fonctionne:
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?
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
( 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:
la partie relationnelle d'un dB relationnel est beaucoup plus optimisée que certaines autres parties (par exemple.
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!
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:
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:
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
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:
Cela rend la structure de données extrêmement flexible et toujours interrogée avec une vitesse raisonnable.
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.