سؤال

أحاول إنشاء بعض الوظائف التي تحافظ على مسار التدقيق من كيفية تغيير البيانات في نموذج مستخدم معين بمرور الوقت، مع مراجعة مؤرخة عند سفح تلك الصفحة. علي سبيل المثال:

02/04/09 21:49 تغير الاسم من "توم" إلى "كريس".

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

هل هذا هو أفضل نهج يأخذ؟

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

المحلول

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

نصائح أخرى

لست متأكدا من وجود "أفضل نهج" واحد، وهناك العديد من المتغيرات التي يجب مراعاتها، بما في ذلك مدى إدراك مسار التطوير الذي أنت عليه.

بعد أن كان من خلال حلول التدقيق المستندة إلى التعليمات البرمجية و DB-TRIGGER، أدرجت بعض التعليقات أدناه؛ آمل أن تتمكن من رؤية مكان وجودك الآن (من حيث التنمية) قد تؤثر على هذه القضايا:

  • إذا كنت بحاجة إلى تعيين المستخدم الذي غير المستخدم (الذي تقوم به عادة)، فسوف يحتاج مشغلات DB إلى الحصول على هذه المعلومات بطريقة أو بأخرى. ليس مستحيلا، ولكن المزيد من العمل وعدة طرق للتعامل مع هذا (استعلام المستخدم لتنفيذ المستخدم، عمود المستخدم الشائع في كل جدول، إلخ)
  • إذا كنت تستخدم مشغلات DB وأنت تعتمد على عدد الصفوف المتأثرة التي تم إرجاعها من الاستعلامات، فإن مشغلات التدقيق الخاصة بك تحتاج إلى إيقاف تشغيل هذا، أو تعديل التعليمات البرمجية الموجودة لحسابها.
  • تقدم IMHO DB Triggers مزيدا من الأمان، وتقدم مسارا أسهل لتدقيق الأتمتة، ومع ذلك فهي ليست مضمونة، حيث يمكن لأي شخص لديه وصول مناسب من تعطيل المشغلات وتعديل البيانات ثم تمكنها مرة أخرى. وبعبارة أخرى، تأكد من ضيق حقوق الوصول إلى أمان DB.
  • إن وجود طاولة واحدة للتاريخ ليس وسيلة سيئة للذهاب، على الرغم من أنه سيكون لديك المزيد من العمل للقيام به (والبيانات لتخزينها) إذا كنت تقوم بمراجعة التاريخ على جداول متعددة، خاصة عندما يتعلق الأمر بإعادة بناء درب التدقيق. يجب عليك أيضا التفكير في قضايا القفل إذا كان هناك العديد من الجداول التي تحاول الكتابة إلى جدول تدقيق واحد.
  • وجود جدول سجل التدقيق لكل جدول هو خيار آخر. تحتاج فقط إلى كل عمود في جدول التدقيق ليكون ظلا، بالإضافة إلى تخزين تاريخ ووقت العمل (إدراج / تحديث / حذف) والمستخدم المرتبط بالإجراءات.
  • إذا ذهبت مع خيار الجدول الفردي، إلا إذا كان لديك الكثير من الوقت لقضاء على هذا، فلا تحصل على تخيل للغاية في محاولة التدقيق فقط على التحديثات أو حذفها، على الرغم من أنه قد يكون مغريا لتجنب إدراج (لأن معظم التطبيقات تفعل ذلك في كثير من الأحيان من التحديثات أو الحذف)، يعيد بناء سجل التدقيق يأخذ جزءا عاديا من العمل.
  • إذا كانت خوادمك أو بياناتك تمتد مناطق زمنية متعددة، ففكر في استخدام نوع DETETIME المناسب لتكون قادرا على تخزين وإعادة بناء التاريخ، أي تاريخ حدث Audit Audit في UTC بالإضافة إلى إزاحة TimeZone.
  • يمكن أن تصبح طاولات التدقيق هذه ضخمة، لذلك لديك استراتيجية إذا بدأوا في التأثير على الأداء. تتضمن الخيارات الجدول التقسيم على أقراص مختلفة، أرشفة، إلخ. التفكير أساسا في هذا الآن وليس عندما يصبح مشكلة :)

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

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

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

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

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

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

أعتقد أن اقتراحك سيتضمن كتابة الكثير من التعليمات البرمجية / البيانات الوصفية لتمكين مقارنة الأشياء / السجلات حتى تحصل على مراجعة حسابات على مستوى الأعمال.

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

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

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