8
votes

Structure de base de données créée par l'utilisateur: bases de données non relationnelles ou relationnelles?

Je veux avoir des champs dynamiques dans mes dossiers de base de données.

Par exemple: Je veux construire une application pour les utilisateurs de créer leurs propres formes .

Un utilisateur peut créer les formes suivantes:

Profil personnel:

  • Nom complet
  • Rue
  • Job
  • Téléphone
    • Accueil
    • travail
    • Mobile
    • Centres d'intérêt
      • Intérêt 1
      • Intérêt 2
      • Intérêt 3

        Travail:

        • Prénom
        • Nom
        • Travail
            Département
            • Spécialité 1
            • Spécialité 2 Département
              • Spécialité 1
              • Spécialité 2

                Pays:

                • États-Unis
                  • États
                    • New York
                      • Villes
                        • New York
                        • Foo
                        • Alabama
                          • Villes
                            • Bar
                            • Baz

                              Comme vous pouvez le voir est une structure très dynamique:

                              • Aucun nombre prédéfini de champs
                              • Pas de noms de champs prédéfinis
                              • L'utilisateur crée la structure de la base de données

                                Alors je me demande, quelle est la meilleure base de données pour cette: bases de données relationnelles (MySQL / PostgreSQL) ou non-relationnelle comme MongoDB / CouchDB / ou même cassandra xml comme Xindice

                                Et même si je choisis les bases de données non relationnelles pour cela, serait-il intelligent pour stocker des informations critiques sur la sécurité comme les informations client et de facturation?

                                Je l'ai entendu des gens dire que si vos informations nécessitent l'unicité puis utilisez la base de données relationnelle. « Nous ne voulons pas risquer de facturer nos clients deux fois ». Quels sont les problèmes sur les bases de données non relationnelles signifient-ils réellement? Vous ne pouvez pas stocker des données uniques dans des bases de données non relationnelles?

                                Une autre chose que je pensais: Ne l'enregistrement des données dans les bases de données non relationnelles signifie que je vais avoir des entrées en double ?

                                Prenons cet exemple:

                                Catégories:

                                • Bureau

                                  • Applications
                                    • TextMate
                                      • Auteur: Foobar
                                      • Prix: 120
                                      • Foo
                                        • Auteur: Foobar
                                        • Prix: 120
                                        • Bureau

                                          • Applications
                                            • TextMate
                                              • Auteur: Foobar
                                              • Prix: 120
                                              • Bar
                                                • Auteur: Foobar
                                                • Prix: 120

                                                  Comme vous le voyez il y a des situations pour des entrées identiques. Comment gérer les bases de données non relationnelles ceux-ci? Im tellement habitué à des bases de données relationnelles.

                                                  Je résume mes questions:

                                                  • Quel type de base de données pour la structure de base de données créée par l'utilisateur?
                                                  • sont des bases de données non-realtional pour stocker la sécurité des informations critiques?
                                                  • Comment les bases de données non-realtional gérer duplications?

0 commentaires

3 Réponses :


-1
votes

La base de données à choisir dépend de quoi et comment vous voulez interroger quelque chose de Moreso que ce que vous voulez stocker. Tous les DBS vous permettront de stocker à peu près tout ce que vous voulez.

Les SJB sont particulièrement bons à interrogation sur la base du modèle relationnel et de le faire raisonnablement arbitrairement. À travers des filtres ad hoc et des jointures, vous pouvez faire toutes sortes de magies.

Les DB NOSQL ont tendance à être moins flexibles sur leurs requêtes, mais font bien dans d'autres tâches (telles que le fonctionnement mieux sur les données "non structurées" par exemple).

Compte tenu de ce que vous avez posté ici, je voudrais simplement utiliser une base de données SQL et définir les tables au fur et à mesure que l'utilisateur leur souhaite défini. Configurez les index, configurez les requêtes. Cela ressemble à un vrai pas d'évidence pour moi. SQL DBS gère tous ces «champs définissant des champs à la mouche», car ... c'est ce qu'ils font. Alors utilisez cela.


5 commentaires

Ah bon? Je ne compterais pas cela comme une force de DBS relationnelle. Les alternatives sont beaucoup mieux pour la gestion des données dynamiques. La seule raison pour laquelle vous voudriez aller avec une DB relationnelle pour quelque chose comme celle-ci est un soutien - il y a beaucoup plus de lecture et de soutien aux bases de données relationnelles que pour les alternatives NOSQL.


"SQL DBS gère tous ces" champs définissant sur la mouche "Stuff Habituellement". Pourriez-vous me montrer le lien vers cette caractéristique de la définition de champs / colonnes à la volée? "Les DB de NosqL ont tendance à être moins flexibles sur leurs requêtes, mais font bien dans d'autres tâches (telles que fonctionnant mieux sur les données" non structurées "par exemple)". N'est-ce pas un exemple de seulement des données non structurées?


Vous pouvez émettre ajouter des relevés de colonne en réponse aux actions des utilisateurs pour "définir des champs à la volée", mais ce n'est pas une bonne idée. Les implémentations de base de données SQL ne manipulent pas nécessairement des centaines de colonnes.


@joey Adams. Je suis d'accord! Et puis depuis chaque entrée / rangée a ses propres champs / colonnes, je ne devrais vraiment pas ajouter de nouvelles colonnes à une table entière!


@ajsie: En fait, je ne pense pas que ce soit le cas. Ajout de colonnes (dans PostgreSQL, au moins) ne passe pas à travers et engraissez toutes les lignes de la table, alors je doute que de nombreuses colonnes annulées dans une nouvelle ligne prennent de l'espace supplémentaire. Cependant, PostgreSQL a un Colonnes maximales par table de 2500 - 1600 Selon les types de colonnes .



2
votes

Si vos données conviennent assez bien au modèle relationnel, mais vous devez stocker des données formatées de manière dynamique qui n'est pas énorme, alors vous serez probablement mieux en train de stocker JSON, XML ou similaire dans une colonne. Bien que vous perdiez des avantages de la saisie de SQL de première classe en faisant cela (indexation, vérification de la contrainte de clé étrangère, vérification de type, etc.), il est bon de stocker des documents structurés de manière dynamique lorsque vos requêtes ne se soucient pas beaucoup de leurs internes. < / p>

Si vous êtes intéressé à stocker principalement des données relationnelles avec une touche JSON / XML / etc., je vous recommande de regarder PostgreSQL. PostgreSQL a un type de données XML, mais je ne vous recommande pas de l'utiliser depuis que je déteste XML: p. Personne ne vous empêche de stocker JSON dans un champ de texte, mais PostgreSQL aura bientôt un type de données JSON avec des fonctions de support. HSTORE Le module de contributions offre un moyen efficace de stocker des paires de clé / valeur et fournit également un support d'index de texte complet.

Bien que pousse JSON ou similaire dans une colonne de base de données SQL vole face au modèle relationnel, vous êtes habituellement mieux de le faire quand même (quand cela a du sens!). Sinon, vous devez expliquer l'ensemble du schéma de votre application à la base de données, ce qui aboutit à beaucoup de code de cartographie SQL et de base de données qui ne fait vraiment rien.


2 commentaires

PG N'a-t-il pas bientôt un jeu de données JSON? Je pensais avoir entendu quelque chose à ce sujet dans 9.0 ou 9,1


Stocker le JSON comme champ de texte semble assez inutile d'un point de vue de stockage de données. Ensuite, vous devez sérialiser et désérialiser pour vous assurer que le JSON est valide. Je n'aime pas cette solution. Pour les exigences, il semble que une solution NOSQL comme MongoDB ou Couchdb est beaucoup supérieure.



3
votes

Je vous recommande vivement de consulter Couchdb pour cela.

  1. Vous communiquez avec Couchdb à l'aide d'une API de repos simple. En d'autres termes, il est "< fait du web" plutôt que simplement d'être un dB backend comme MongoDB et d'autres. CouchDB peut réellement servir les formulaires et recevoir des soumissions depuis qu'un serveur Web intégré.
  2. Être un magasin de documents JSON Il convient parfaitement à la conservation des données structurées à la schémas. (Les formulaires et leurs soumissions sont vraiment des documents et il est plus logique de les modéliser de cette façon, Imo.)
  3. Vous pouvez facilement stocker un document JSON qui décrit chaque formulaire Web dans le même "godet" comme soumissions de formulaire. (COUCHDB peut même analyser les postes de former et les transformer en documents JSON, mais vous voyez l'ajustement. L'avoir automatiquement des soumissions de formulaire d'horodatage, par exemple, est simple.)
  4. Vous pouvez écrire ce que l'on appelle une fonction "_Show" pour générer le code HTML de chaque formulaire dans Couchdb. Découvrez également les fonctions "_Update" et de validation.
  5. Il possède les fonctionnalités de sécurité dont vous auriez besoin.
  6. Les conflits de documents peuvent être identifiés facilement. Encore meilleur, Couchdb détermine automatiquement une version "gagnante" du document, mais vous continuerez d'avoir accès aux versions de documents "Perdre" (jusqu'à ce que vous disiez que CouchDB compacte la base de données, qui supprime les anciennes révisions.)
    • En ce qui concerne l'unicité: au lieu d'avoir CouchDB générer un document DOC _ID unique, vous voudrez attribuer un IDID qui représente vraiment une soumission de formulaire unique. Si chaque utilisateur est autorisé uniquement une soumission par formulaire, utilisez quelque chose sur ces lignes pour chaque document JSON créé à partir d'une soumission de formulaire: Soumission: Utilisateur: 5: Formulaire: A3DF2A712

      Utilisation de CouchDB Vous pouvez éviter la douleur de créer de manière dynamique des tables uniques pour chaque formulaire qu'un utilisateur pourrait créer.


3 commentaires

J'ai examiné Mongodb et Couchdb. Ils semblent être une bonne solution pour ce type de structure dynamique. Avez-vous essayé l'ancien aussi?


Mongodb est très différent. Pour ce que vous voulez faire - ce qui implique de servir et de traiter des réponses de formulaire Web - CouchDB semble une bonne ajustement. MongoDB n'a pas de serveur Web intégré et n'est pas capable de manipuler intérieurement des formes. Bien sûr, vous pouvez toujours utiliser MongoDB pour simplement stocker des données JSON. Mais CouchDB vous donne un certain nombre d'outils intégrés que vous devez vous écrire.


Vous voudrez peut-être vérifier comment fonctionne les Couchapps. ( COUCHAPPS.ORG ) Couchapps est un exemple parfait de quelque chose que MongoDB ne peut pas fournir car il est "juste" une base de données .