الجداول التاريخ إيجابيات السلبيات والسلبيات - باستخدام المشغلات، وتنجم أو عند مستوى التطبيق [مغلق

StackOverflow https://stackoverflow.com/questions/1250507

سؤال

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

حتى الآن يمكنني التفكير في ثلاث أماكن مختلفة يمكنك القيام بعمل جدول التاريخ.

  • مشغلات على الطاولة الرئيسية للتحديث وإدخال وحذف. (قاعدة البيانات)
  • الإجراءات المخزنة. (قاعدة البيانات)
  • طبقة التطبيقات. (تطبيق)

سؤالي الرئيسي هو، ما هي إيجابيات السلبيات والسلبيات من القيام بالعمل في كل من هذه الطبقات.

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

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

المحلول

سأضعه بهذه الطريقة:

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

نصائح أخرى

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

بالنسبة لأولئك الذين يعتقدون أن المشغلات أكثر أمانا من المتداولين لأنهم لا يمكن تجاوزهم وأذكرهم بأنهم يقومون بأداء الافتراض التالي:

!) أذونات موجودة التي توقف المستخدمين من تنفيذ المشغل تعطيل [ولكن بعد ذلك، يمكن أن توجد أذونات أيضا للحد من جميع الوصول إلى قاعدة البيانات باستثناء التنفيذ على Sprocs التي هي نمط شائع لتطبيقات المؤسسات] - وبالتالي يجب على المرء تحمل الأذونات الصحيحة وبالتالي المشغلات من حيث الأمن والقدرة على الالتفاف

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

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

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

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

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

تم استخدام النهج القائم على الزناد لسنوات وقد عملت بالتأكيد جيدا بالنسبة لنا، ولكن بعد ذلك لديك النقاط التالية للتفكير في:

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

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

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

  4. في حالة تطبيقات الويب، حيث يتم إنشاء الاتصالات من حمام سباحة، يمكن تتبع المستخدمين الفعليين الذين جعلوا التغييرات مملة. سيكون الحل المحتمل هو الحصول على حقل "EditedBy" في كل جدول معاملات.

في وقت متأخر من واحد لكنه يضيف زوجين المزيد من الخيارات التي يمكن النظر فيها.

تغيير التقاط البيانات: هذه تتوفر ميزة في SQL Server 2008 R2 + ولكن فقط في Enterprise Edition. يسمح لك بتحديد الجداول التي تريد تتبعها وسيقوم SQL Server بعمل المهمة لك. يعمل عن طريق قراءة سجل المعاملات وملء جداول التاريخ مع البيانات.

قراءة سجل المعاملات: إذا كانت قاعدة البيانات في وضع الاسترداد الكامل، فيمكن قراءة سجل المعاملات والتفاصيل حول المعاملات تقريبا.

الجانب السلبي هو أن هذا غير مدعوم افتراضيا. الخيارات هي قراءة سجل المعاملة باستخدام وظائف غير موثقة مثل FN_DBLOG أو أدوات الطرف الثالث مثل apexsql log..

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

كل هذه العمل في مستوى قاعدة البيانات وشفافة تماما للتطبيق.

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

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

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

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