L'inventaire de conception de base de données
C'est une question qui n'est pas vraiment à propos de "programmation" (n'est pas spécifique à une langue ou une base de données), mais plus de la conception et de l'architecture. C'est aussi une question du type "Quelle est la meilleure façon de faire X". J'espère ne pas causer trop de "religieux" de la controverse.
Dans le passé, j'ai mis au point un système d'une manière ou d'une autre, de garder une certaine forme d'inventaire des articles (pas pertinentes en ce que les éléments). Certains à l'aide de langues/DB, qui ne supportent pas les transactions. Dans ces cas, j'ai choisi de ne pas enregistrer l'élément quantité en main dans un champ de l'enregistrement d'article. Au lieu de la quantité en main est calculé en totalisant inventaire reçus - total des stocks vendus. Cela a entraîné presque pas de divergences dans l'inventaire en raison de logiciel. Les tableaux sont indexés correctement et la performance est bonne. Il y a un processus d'archivage dans le cas où le montant de départ de l'enregistrement d'influer sur les performances.
Maintenant, à il ya quelques années j'ai commencé à travailler dans cette entreprise, et j'ai hérité d'un système qui permet le suivi des stocks. Mais la quantité est enregistré dans un champ. Lorsqu'une entrée est enregistrée, la quantité reçue est ajouté à la zone de la quantité de l'élément. Quand un article est vendu, la quantité est soustrait. Cela a entraîné des divergences. À mon avis, ce n'est pas la bonne approche, mais le précédent programmeurs ici ne jurent que par elle.
Je voudrais savoir si il existe un consensus sur ce qu'est la bonne façon est de concevoir un tel système. Aussi quelles sont les ressources disponibles, imprimée ou en ligne, de demander des conseils sur ce.
Grâce
- Quand vous dites "la précédente programmeurs ici ne jurent que par elle", voulez-vous dire qu'ils jure à chaque fois qu'ils ont à travailler sur elle?
Vous devez vous connecter pour publier un commentaire.
J'ai vu les deux approches à mon entreprise actuelle et serait certainement se pencher vers la première (calcul de totaux basée sur les transactions boursières).
Si vous êtes seulement de stocker une quantité totale dans un champ quelque part, vous n'avez aucune idée de comment vous êtes arrivé à ce nombre. Il n'y a pas d'historique des transactions et vous pouvez vous retrouver avec des problèmes.
Le dernier système, j'ai écrit des pistes d'actions par le stockage de chaque transaction comme un enregistrement avec un effet positif ou négatif sur la quantité. J'ai trouvé ça fonctionne très bien.
J'ai Vol 1 et Vol 2 et ceux-ci ont été très utiles dans le passé.
Il dépend, systèmes d'inventaire sont bien plus qu'un simple comptage des éléments. Par exemple, pour les fins de la comptabilité, vous pourriez avoir besoin de connaître la valeur comptable des stocks en fonction de la FIFO (First-in-First-out) modèle. Qui ne peut pas être calculée par simple ", un total de stocks reçus - total des stocks vendus" de la formule. Mais leur modèle peut calculer facilement, parce qu'ils modifient la valeur comptable, car ils vont. Je ne veux pas entrer dans les détails car ce n'est pas de la programmation de la question, mais si ils ne jurent que par elle, peut-être que vous ne comprenez pas pleinement de tous leurs exigences auxquelles ils doivent répondre.
les deux sont valables, selon les circonstances. Le premier est meilleur lorsque les conditions suivantes s'appliquent:
d'autre part, si vous avez un grand nombre d'éléments, plusieurs des cas exceptionnels, et un accès plus fréquent, il sera plus efficace de maintenir la quantité de l'article
notez également que si votre système a des divergences puis il a des bugs qui devrait être traqué et éliminé
j'ai fait des systèmes de deux façons, et dans les deux sens peut très bien fonctionner - tant que vous ne l'ignorez pas les bugs!
Prendre un regard sur les ARTS (Association pour le commerce de Détail les Normes de la Technologie) modèle de données (http://nrf-arts.org). Il utilise un StockLedger table avec un enregistrement de chaque élément et des changements à l'inventaire sont tous suivis dans InventoryJournalEntries.
Il est important de considérer le système existant et le coût et le risque d'en changer. Je travaille avec une base de données qui stocke des stocks de genre comme de la vôtre, mais il comprend des cycles d'audit et stocke les réglages comme des reçus. Il semble bien fonctionner, mais tout le monde est bien formé, et le personnel de l'entrepôt ne sont pas exactement rapide à apprendre de nouvelles procédures.
Dans votre cas, si vous êtes à la recherche pour un peu plus de suivi sans changer l'ensemble de la structure db alors je vous suggérons d'ajouter un tableau de suivi (un peu comme à partir de votre "transaction" de la solution) et puis le journal des modifications au niveau des stocks. Il ne devrait pas être trop dur pour mettre à jour la plupart des modifications au niveau des stocks de sorte qu'ils laissent un relevé d'opération. Vous pouvez également ajouter une tâche périodique pour sauvegarder le niveau de stock à la table des transactions, toutes les deux heures ou si, de sorte que même si vous manquez une transaction que vous pouvez découvrir lorsque le changement qui s'est passé ou revenir à un état précédent.
Si vous voulez voir comment une grande demande-t-il, prendre un coup d'oeil à SugarCRM, ils ont et le module de gestion de stock si je ne suis pas sûr de savoir comment il stocke les données.
Je pense que c'est en fait un best-practices question à propos de faire une (relativement) cher compter toutes les fois que vous besoin d'un total vs. faire que de compter chaque fois que quelque chose change, puis stocker le nombre dans un champ, et à la lecture de ce champ à chaque fois que vous avez besoin d'un total.
Si je ne pouvais pas utiliser les transactions, j'irais avec le compteur à chaque fois que j'avais besoin d'un total. Si les transactions sont disponibles, il serait sûr d'effectuer les opérations de mise à jour de l'inventaire et de l'économie de la re-compté total au sein de la même opération, ce qui permettrait d'assurer l'exactitude du comptage (bien que je ne suis pas sûr que ce serait de travailler avec plusieurs utilisateurs accèdent à la base de données).
Mais si la performance n'est pas vraiment un énorme problème (et des bases de données modernes sont assez bonnes à compter les lignes que j'allais rarement, même à vous inquiéter à ce sujet), j'aurais juste coller avec le compteur à chaque fois.
J'opterais pour la première, où
Le Droit Chemin, de l'OMI.
EDIT: je voudrais également déterminant dans les actions des pertes ou des dommages dans le système, mais je suis sûr que vous avez couvert.
J'ai travaillé sur des systèmes qui permettent de résoudre ce problème avant. Je pense que la solution idéale est un précalculées colonne, ce qui vous obtient le meilleur des deux mondes. Votre total serait un champ quelque part, donc pas cher, les recherches, mais il ne peut pas sortir de la synchronisation avec le reste de vos données (la base de données maintient l'intégrité). Je ne me souviens pas de qui RDMSs soutien précalculées colonnes, mais si vous n'avez pas de transactions, qui peut ne pas être disponible.
Vous pourriez potentiellement faux précalculées colonnes (de manière très efficace... je ne vois pas d'inconvénient) à l'aide de déclencheurs. Vous auriez probablement besoin transactions que. À mon humble avis, en gardant l'intégrité des données lorsque vous êtes en train de faire ce genre de contrôlée de dénormalisation est le seul usage légitime pour un déclenchement.
Django-inventaire davantage orientée vers les actifs fixes, mais peut vous donner quelques idées.
IE: ItemTemplate (classe) -> ItemsOnHand (exemple)
ItemsOnHand peut être lié à plusieurs ItemTemplates; Exemple de l'Imprimante & les cartouches d'encre est exige. Ceci permet également de définir des points de réapprovisionnement pour chaque ItemOnHand.
Chaque ItemsOnHand est liée à InventoryTransactions, cela facilite la vérification.
Pour éviter le calcul réel sur la main de milliers de invetory les transactions, les points de contrôle sont utilisés qui sont juste un équilibre + une date. Pour calculer les éléments sous la main de la requête pour trouver le dernier point de contrôle et de commencer en ajoutant ou en soustrayant les éléments de trouver l'équilibre actuel entre les éléments. Définir de nouveaux points de contrôle périodiquement.
Je peux voir quelques avantages d'avoir deux colonnes, mais je ne suis pas à la suite de la partie sur les écarts - vous semblent être ce qui implique que le fait d'avoir les deux colonnes (in et out) est moins sujettes à la différence qu'une seule colonne (en cours). Pourquoi est-ce?
Est de ne pas avoir une ou deux colonnes, ce que je voulais dire avec ", un total de stocks reçus - total des stocks vendus" est quelque chose comme ceci:
puis
Veuillez garder à l'esprit que j'ai simplifié à l'extrême et que mes explications. Je sais qu'il existe beaucoup plus de stocks que juste garder une trace de la quantité, mais dans ce cas c'est là que se trouve le problème et ce que nous voulons corriger. À ce stade, la raison pour le changement c'est exactement le coût de prise en charge les problèmes causés par la conception actuelle.
Aussi je voulais mentionner que, bien que ce n'est pas un "codage" est liée à algoritms et de conception à mon humble avis sont très importants sujets.
Merci à tous pour vos réponses jusqu'à présent.
Nelson Marmol
Nous résoudre différents problèmes, mais notre approche pour certains d'entre eux pourraient être intéressants pour vous.
Nous permettre au système de faire un "best guess", et de donner aux utilisateurs une rétroaction régulière sur l'un de ces suppositions qui regarde mal.
Pour appliquer ce pour l'inventaire, vous pouvez avoir 3 champs:
Ensuite, vous pouvez exécuter un processus (par jour?) le long des lignes de:
Bien sûr, cela repose sur les utilisateurs à la recherche à cette alerte, et de faire quelque chose à ce sujet.
Aussi, vous pourriez avoir une fonction pour réinitialiser l'inventaire d'une façon, soit par la mise à jour de inventory_sold/reçu, ou peut-être l'ajout d'un autre champ "inventory_adjustment", qui pourrait être positif ou négatif.
... juste quelques pensées. J'espère que c'est utile.