سؤال

هذا سؤال لا يتعلق حقًا بـ "البرمجة" (لا يقتصر على أي لغة أو قاعدة بيانات)، ولكنه يتعلق أكثر بالتصميم والهندسة المعمارية.إنه أيضًا سؤال من النوع "ما هي أفضل طريقة للقيام بـ X".وآمل ألا يسبب الكثير من الجدل "الديني".

لقد قمت في الماضي بتطوير أنظمة تحافظ بطريقة أو بأخرى على شكل من أشكال جرد العناصر (ليست ذات صلة بالعناصر).يستخدم البعض اللغات/قواعد البيانات التي لا تدعم المعاملات.في تلك الحالات اخترت عدم حفظ العنصر كمية في اليد في حقل في سجل العنصر.بدلا من ذلك كمية في اليد يتم حساب إجمالي المخزون المستلم - إجمالي المخزون المباع.وقد أدى ذلك إلى عدم وجود أي اختلافات تقريبًا في المخزون بسبب البرامج.تمت فهرسة الجداول بشكل صحيح والأداء جيد.توجد عملية أرشفة في حالة بدء تأثير حجم السجل على الأداء.

الآن، منذ سنوات قليلة بدأت العمل في هذه الشركة، وقد ورثت نظامًا لتتبع المخزون.ولكن يتم حفظ الكمية في الحقل.عند تسجيل إدخال، تتم إضافة الكمية المستلمة إلى حقل الكمية الخاص بالصنف.عند بيع السلعة، يتم طرح الكمية.وقد أدى هذا إلى تناقضات.في رأيي هذا ليس هو النهج الصحيح، ولكن المبرمجين السابقين هنا أقسموا به.

أود أن أعرف ما إذا كان هناك إجماع حول الطريقة الصحيحة لتصميم مثل هذا النظام.وأيضًا ما هي الموارد المتاحة، المطبوعة أو عبر الإنترنت، للحصول على إرشادات بشأن هذا الأمر.

شكرًا

هل كانت مفيدة؟

المحلول

ولقد رأيت كل من يقترب في شركتي الحالية وسوف العجاف بالتأكيد نحو أول (حساب المجاميع على أساس المعاملات الأسهم).

إذا كنت فقط تخزين الكمية الإجمالية في حقل في مكان ما، لديك أي فكرة عن كيفية وصولك إلى هذا العدد. لا يوجد تاريخ المعاملات ويمكنك في نهاية المطاف مع المشاكل.

وهذا النظام الماضي كتبت الأسهم المسارات من خلال تخزين كل معاملة كسجل بكمية إيجابية أو سلبية. وقد وجدت أنه يعمل بشكل جيد جدا.

نصائح أخرى

وهذا يعتمد، نظم الجرد هي أكثر بكثير من حول البنود مجرد العد. على سبيل المثال، لأغراض المحاسبة، قد تحتاج إلى معرفة القيمة المحاسبية للمخزون على أساس FIFO (أولا-في الأولى المغادرة) نموذج. لا يمكن حساب بسيطة "بقيمة المخزون تلقى - إجمالي المخزون تباع" الصيغة. لكن نموذجهم قد حساب هذا بسهولة، لأنهم تعديل القيمة الدفترية لأنها تذهب. لا أريد الخوض في التفاصيل لأن هذه ليست برمجة القضية ولكن إذا كانوا أقسم به، وربما كنت لم أفهم تماما كل متطلباتهم لديهم لاستيعاب.

وكلاهما صحيح، حسب الظروف.الأول هو الأفضل عندما تتوفر الشروط التالية:

  • عدد العناصر المراد جمعها صغير نسبيًا
  • هناك حالات استثنائية قليلة أو معدومة يجب مراعاتها (الإرجاعات، التعديلات، وما إلى ذلك)
  • ليست هناك حاجة إلى كمية عنصر المخزون في كثير من الأحيان

من ناحية أخرى، إذا كان لديك عدد كبير من العناصر، والعديد من الحالات الاستثنائية، وإمكانية الوصول المتكرر، فسيكون الحفاظ على كمية العنصر أكثر كفاءة

لاحظ أيضًا أنه إذا كان نظامك به تناقضات لديها البق والتي ينبغي تعقبها والقضاء عليها

لقد قمت بعمل الأنظمة في كلا الاتجاهين، ويمكن أن تعمل كلتا الطريقتين بشكل جيد - طالما أنك لا تتجاهل الأخطاء!

ألقِ نظرة على نموذج بيانات ARTS (جمعية معايير تكنولوجيا البيع بالتجزئة) (http://nrf-arts.org).يستخدم جدول StockLedger مع تسجيل كل عنصر ويتم تعقب التغييرات التي تطرأ على المخزون في InventoryJournalEntries.

من المهم النظر في النظام القائم والتكاليف والمخاطر من تغييره. أنا أعمل مع قاعدة بيانات يقوم بتخزين نوع جرد مثل لك لا، ولكنه يشمل دورات التدقيق ومخازن التعديلات تماما مثل الإيصالات. ويبدو أن تعمل بشكل جيد، ولكن كل من شارك ومدربين تدريبا جيدا، وموظفي المستودعات ليست سريعة بالضبط لمعرفة الإجراءات الجديدة.

في الحالة الخاصة بك، إذا كنت تبحث عن تتبع أكثر قليلا من دون تغيير بنية ديسيبل كله ثم كنت أقترح إضافة جدول تتبع (نوع من مثل من الحل الخاص بك 'الصفقة') ثم قم بتسجيل التغييرات في المخزون مستوى. لا ينبغي أن يكون من الصعب جدا لتحديث معظم تغييرات على مستوى المخزون بحيث أيضا ترك سجل المعاملة. يمكنك أيضا إضافة مهمة دورية لعمل نسخة احتياطية من مستوى المخزون إلى طاولة معاملة كل ساعتين أو نحو ذلك بحيث حتى لو كنت أفتقد المعاملة التي يمكن أن تكتشف عندما وقع التغيير أو التراجع إلى حالة سابقة.

إذا كنت تريد أن ترى كيف يمكن لتطبيق واسع أنها لا نلقي نظرة على عيني ، لديهم والمخزون وحدة إدارة الرغم من أنني لست متأكدا من أنه يخزن البيانات.

وأعتقد أن هذا هو في الواقع العام على سؤال حول أفضل الممارسات طريق العد (نسبيا) مكلفة في كل مرة كنت في حاجة الى مجموعه مقابل القيام بذلك الاعتماد في كل مرة يتغير شيء، ثم تخزين العد في حقل وقراءة هذا المجال كلما كنت في حاجة الى المجموع.

إذا لم أتمكن من استخدام المعاملات، وأود أن أذهب مع عدد الحية في كل مرة كنت بحاجة إلى المجموع. إذا كانت المعاملات المتاحة، فإنه سيكون آمن لإجراء عمليات التحديث المخزون وتوفير من مجموع عد إعادة ضمن نفس الصفقة، التي من شأنها ضمان دقة العد (على الرغم من أنني لست متأكدا من هذا ستعمل مع عدة مستخدمين ضرب قاعدة البيانات).

ولكن إذا كان الأداء ليست في الحقيقة مشكلة كبيرة (وقواعد البيانات الحديثة هي جيدة بما فيه الكفاية في عد الصفوف التي أود أن نادرا ما تقلق حتى عن ذلك) فما استقاموا لكم فاستقيموا العصا فقط مع العد الحية في كل مرة.

سأختار الطريقة الأولى، حيث

يتم حساب الكمية في متناول اليد التي تم استلامها للمخزون - إجمالي بيع المخزون المباع

الطريق الصحيح، المنظمة البحرية الدولية.

يحرر: أود أيضًا أن أضع في الاعتبار أي خسائر/أضرار في المخزون في النظام، لكنني متأكد من أنك قمت بتغطية ذلك.

ولقد عملت على الأنظمة التي حل هذه المشكلة من قبل. أعتقد أن الحل الأمثل هو عمود precomputed، التي يحصل لك أفضل ما في العالمين. يكون إجمالي التكلفة كما حقل في مكان ما، وبالتالي لا عمليات البحث باهظة الثمن، ولكن لا يمكن الحصول على متزامنة مع بقية البيانات الخاصة بك (تحتفظ قاعدة بيانات سلامة). أنا لا أتذكر التي تدعم RDMSs الأعمدة precomputed، ولكن إذا لم يكن لديك المعاملات، التي قد لا تكون متاحة أيضا.

هل يمكن أن الأعمدة precomputed يحتمل أن تكون وهمية (فعال جدا ... أرى أي سلبيات) باستخدام المشغلات. ربما كنت في حاجة المعاملات بالرغم من ذلك. IMHO، والحفاظ على سلامة البيانات عندما كنت تفعل هذا النوع من denormalization تسيطر هو استخدام الشرعي الوحيد للمشغل.

جانغو الجرد موجهة أكثر إلى الأصول الثابتة، ولكن قد تعطيك بعض الأفكار.

وIE: ItemTemplate (الفئة) -> ItemsOnHand (المثال)

وItemsOnHand يمكن ربط أكثر ItemTemplates. مثال طابعة وخراطيش الحبر يتطلب. وهذا يسمح أيضا لتحديد نقطة إعادة ترتيب لكل ItemOnHand.

ويرتبط كل ItemsOnHand إلى InventoryTransactions، وهذا يسمح لسهولة المراجعة. لتجنب حساب فعلي على العناصر اليد من ألف من المعاملات invetory، وتستخدم نقاط التفتيش التي ليست سوى توازن + تاريخ. لحساب العناصر على الاستعلام اليد للعثور على نقطة تفتيش أحدث والبدء في إضافة أو substracting العناصر لإيجاد التوازن الحالي من العناصر. تحديد نقاط تفتيش جديدة بشكل دوري.

وأستطيع أن أرى بعض الفوائد إلى وجود عمودين، ولكن أنا لا تتبع جزء عن التناقضات - يبدو أنك يلمح إلى أن وجود عمودين (داخل وخارج) أقل عرضة للتفاوت من عمود واحد ( تيار). لماذا؟

هل عدم وجود واحد أو اثنين من الأعمدة، ما قصدته ب "بقيمة المخزون تلقى - إجمالي المخزون تباع" شيء من هذا القبيل:

Select sum(quantity) as inventory_received from Inventory_entry
Select sum(quantity) as inventory_sold from Sales_items

ثم

Qunatity_on_hand = inventory_received - inventory_sold

ويرجى أن نضع في اعتبارنا أن التبسيط هذا وتعليلي الأولي. أعرف أن هناك ما هو أكثر من ذلك بكثير لجرد أن مجرد تتبع كميات، ولكن في هذه الحالة وهذا ما كانت المشكلة تقع وماذا نريد لإصلاح. عند هذه النقطة سبب لتغييره هو preciselly تكلفة دعم المشاكل الناجمة عن التصميم الحالي.

وأيضا أردت أن أذكر أنه على الرغم من هذا لا علاقة ل"الترميز" المسألة لalgoritms والتصميم الذي IMHO هي المواضيع الهامة جدا.

وشكر الجميع على إجاباتك حتى الآن.

ونيلسون مارمول

ونحن في حل المشاكل المختلفة، ولكن منهجنا في بعضها قد تكون مثيرة للاهتمام بالنسبة لك.

ونحن نسمح للنظام لتقديم "أفضل تخمين"، وإعطاء المستخدمين تغذية راجعة منتظمة حول أي من تلك التخمينات التي تبدو خاطئة.

لتطبيق هذا إلى المخزون، هل يمكن أن يكون 3 مجالات:

inventory_received
inventory_sold
estimated_on_hand

وبعد ذلك، هل يمكن تشغيل عملية (يوميا؟) على غرار:

SELECT * 
FROM   Inventory
WHERE  estimated_on_hand != inventory_received - inventory_sold

وبطبيعة الحال، وهذا يعتمد على المستخدمين الذين يبحثون في هذا التنبيه، وتفعل شيئا حيال ذلك.

وأيضا، هل يمكن أن يكون وظيفة لإعادة جرد بعض كيف، إما عن طريق تحديث inventory_sold / تلقى، أو ربما مضيفا الميدان "inventory_adjustment" آخر، والتي يمكن أن تكون إيجابية أو سلبية.

و... فقط بعض الأفكار. نأمل أن تكون مفيدة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top