سؤال

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

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

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

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

المحلول

يطلق عادة ما استخدمت بشكل غير صحيح ، وإدخال الخلل وبالتالي ينبغي تجنبها.ابدأ تصميم الزناد للقيام سلامة القيد التحقق من أن يعبر الصفوف في الجدول (هـ.ز "متوسط الراتب من قبل قسم لا يمكن أن يتجاوز X).

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

يمكن أن يؤدي استخدامها بشكل صحيح ؟ الاطلاق.

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

نصائح أخرى

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

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

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

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

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

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

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

نعم, أعتقد أن وجود لتجاوز الزناد يعني أنك "أفعل ذلك الخطأ";في هذه الحالة الزناد ليست لك.

enter image description here

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

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

بعض الأسباب لماذا أنا لا أحب المشغلات:

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

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

"لن تصميم الزناد للقيام سلامة القيد التحقق من أن يعبر الصفوف في جدول" -- أنا لا يمكن أن نوافق على ذلك.السؤال هو الموسومة 'SQL Server' والتحقق من القيود' بنود في SQL Server لا يمكن أن يحتوي على استعلام فرعي;أسوأ تنفيذ يبدو أن 'الثابت ترميز' افتراض أن تحقق سوف تنطوي على صف واحد فقط وذلك باستخدام وظيفة لا يمكن الاعتماد عليها.حتى إذا كنت بحاجة إلى القيد الذي لا شرعيا تنطوي على أكثر من صف واحد -- وهو مثال جيد هنا هو التسلسل المفتاح الأساسي في الكلاسيكية 'صالح' الوقت الزمني الجدول حيث كنت في حاجة لمنع تداخل فترات نفس الجهة -- كيف يمكنني أن أفعل ذلك دون الزناد ؟ تذكر هذا هو المفتاح الأساسي ، شيء لضمان لدي سلامة البيانات ، لذلك فرض عليه في أي مكان آخر من DBMS هو وارد.حتى تحقق القيود على الاستعلامات الفرعية ، أنا لا أرى بديلا باستخدام مشغلات لأنواع معينة من سلامة القيود.

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

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

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

بعد أن تجاوز الزناد أن تفعل شيئا ، فإنه يمكن أن يعني كنت تفعل شيئا خاطئا ، أو قد يعني أن تؤدي تفعل شيئا خاطئا.

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

أجد نفسي وتجاوز مشغلات عندما تفعل معظم بيانات الواردات.أعتقد أنه مبرر في مثل هذه الظروف.

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

عموما أنا أصوت ل "أنها تخدم الغرض في بعض السيناريوهات".أنا دائما عصبية حول تأثيرات الأداء.

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

أنا أول استخدام مشغلات بضعة أسابيع.غيرنا أكثر الإنتاج من SQL server 2000 و SQL server 2005 و وجدنا أن السائقين كانوا يتصرفون بشكل مختلف مع NText المجالات (تخزين كبيرة مستند XML), انزال البايت الأخير.أنا استخدم الزناد كحل مؤقت لإضافة المزيد من دمية بايت (الفضاء) إلى نهاية البيانات, حل مشكلة لدينا حتى حل مناسب يمكن تعميمها.

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

بصراحة المرة الوحيدة التي يمكنني استخدام مشغلات لمحاكاة فهرس فريد يسمح لها فارغة التي لا تعتمد على التفرد.

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

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

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

مجموع مروحة ،

ولكن حقا يجب أن تستخدم لماما عندما ،

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

  • تحتاج إلى تسجيل التغييرات (في مراجعة الجدول على سبيل المثال ، فإنه من المفيد أن نعرف ما @@المستخدم لم تتغير و عندما حدث)

بعض RDBMS مثل sql server 2005 توفر لك أيضا مع مشغلات على إنشاء/تعديل/حذف بيانات (حتى يمكنك أن تعرف الذي خلق ما الجدول عندما أسقطت ما عمود, عندما, الخ..)

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

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

أيضا ، في MS SQL Server, مشغلات أطلقت مرة واحدة في أمر sql, وليس في صف واحد.على سبيل المثال, sql التالية سيتم تنفيذ الزناد مرة واحدة فقط.

UPDATE tblUsers
SET Age = 11
WHERE State = 'NY'

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

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