2009-09-15 5 views
0

Je ne suis pas sûr de comprendre à 100% ce que fait la base de données. Si j'ai juste une idée fausse, s'il vous plaît le signaler. Disons que j'ai une fonction qui veut créer une nouvelle entrée de 100 dans la base de données avec 100.000 entrées.Création de données Django et validation

Il semble beaucoup plus rapide lorsque ces 100 entrées sont créées et que la validation est effectuée après la création de la dernière entrée.

Maintenant, si ces 100 entrées sont créées par différents utilisateurs, y a-t-il un moyen facile de valider seulement après que 100 entrées ont été créées?

Éditer: Devrais-je écrire une sorte de tampon?

Répondre

2

Les bases de données sont optimisées pour les opérations basées sur des ensembles, donc oui, il serait plus rapide d'insérer 100 enregistrements dans un ensemble que d'un à la fois.Cependant, lorsque vous parlez d'utilisateurs qui entrent des enregistrements un par un, vous ne voudriez pas les regrouper dans des circonstances auxquelles je peux penser. Pourquoi? D'abord, s'il y avait un mauvais enregistrement, les autres échoueraient. Cela ferait pour 99 utilisateurs grincheux sur 100 (en fait 100, mais on n'aurait pas vraiment de raison d'être grincheux car il a fait la mauvaise entrée de données pour commencer). Deuxièmement, les utilisateurs ne verront pas les enregistrements immédiatement après leur saisie. Il est également vrai qu'ils ne seraient pas en mesure de faire quelque chose de plus avec ces enregistrements jusqu'à ce qu'ils soient entrés comme entrer des données dans des tables connexes. Avoir un tel retard rendrait les utilisateurs grincheux. Si les utilisateurs entrent des données de clients par un appel téléphonique, ils seront particulièrement grincheux à l'attente (j'ai travaillé dans un centre d'appels avec un produit commercial horriblement lent et croyez-moi je sais à quel point les utilisateurs avaient l'habitude d'obtenir!) les utilisateurs seront passés à autre chose et ne se rendront pas compte que leurs données ont été rejetées pour mauvaise information, pas une bonne chose du tout. Combien de temps allez-vous attendre pour obtenir votre nombre d'enregistrements? 5 secondes, dix minutes? Que se passe-t-il si, pour une raison quelconque, la connexion réseau est perdue pendant ce temps, les utilisateurs ne perdraient pas les données qu'ils ont saisies.

2

Vous pourrait être en mesure de pirater quelque chose comme ça ensemble, mais vous vraiment ne devrait pas, parce que les épaves de votre intégrité des données, ce qui est tout le point de l'utilisation des transactions.

Dans la solution que vous proposez, un problème d'insertion dans le lot entraînerait l'échec de toutes les autres insertions (éventuellement totalement valides) d'utilisateurs complètement différents. En outre, les utilisateurs ne pourraient pas voir les données qu'ils essayaient juste d'insérer parce que le système attendait de faire l'insertion jusqu'à ce que le lot soit plein.

P.S. Voici un quick intro to transaction processing.

1

Je pense que vous avez une idée fausse. On dirait que vous regardez la base de données comme quelque chose qui est seulement pour une sorte de mémoire "à long terme". C'est un mauvais concept. la base de données est la seule la mémoire a votre application. Même lorsque ce n'est pas vrai, il est préférable de prétendre que c'est le cas.

Pour aller un peu plus loin, votre application a:

  • SCOPED mémoire: les variables que vous définissez dans les fonctions de vue, par exemple. Tout cela est détruit quand le flux quitte la fonction. Globals: variables définies dans la partie la plus externe de votre code.
  • globals: variables définies dans la partie la plus externe de votre code. Il est vraiment important de ne pas les utiliser pour n'importe quel type d'état, sauf peut-être des constantes de configuration. L'important est que vous devez compter sur un comportement dynamique. Dans le cas contraire, vous devrez combattre les processus en chaîne et qui ne sont pas conscients l'un de l'autre (en fonction de la passerelle du serveur). Ne fais pas ça.
  • un schéma de mise en cache, si vous choisissez d'en implémenter un. Ceci est entièrement optionnel dans django, et il y a plusieurs façons de le faire. Cependant, on utilise généralement un certain schéma pour s'assurer que même si le cache se bloque, la base de données reflète l'état actuel des données avec précision.
  • votre système de fichiers local. Du point de vue de la conception, la plupart des façons d'en tirer profit ressembleront à un système de mise en cache (ci-dessus) ou seront maladroites et fragiles. Du point de vue des performances, il peut être aussi lent qu'une base de données.
  • votre base de données.

Vous voyez donc qu'il n'y a pas beaucoup de place pour mettre vos données en dehors de la base de données.

Questions connexes