ما هي المشكلة مع تتالي مسارات متعددة المفاتيح الخارجية والدورات؟

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

سؤال

في MSSQL 2005 أنا فقط سدد رسالة الخطأ الشهيرة:

<اقتباس فقرة>   

وإدخال الأجنبي XXX قيد مفتاح على طاولة YYY قد يسبب دورات أو مسارات تتالي متعددة. تحديد ON DELETE NO ACTION أو ON UPDATE NO ACTION، أو تعديل قيود أخرى المفتاح الخارجي.

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

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

ومسارات متعددة ستكون عندما TableA ديه مفاتيح خارجية لTableB وTableC، ولها TableB أيضا مفتاح خارجي لTableC. مرة أخرى - وهذا هو الحد الأدنى من القضية الأساسية

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

في الآخر SO المواضيع يذهب الناس إلى حد تصنيفها باستخدام أجهزة الطرد المركزي ك "<لأ href =" https://stackoverflow.com/questions/1451553/cascading-deletes-causing-multiple-cascade-paths/1451567#1451567 "> محفوفة بالمخاطر"، والدولة التي "<لأ href =" https://stackoverflow.com/questions/851625/foreignkey-constraint-may-cause-cycles-or-multiple-cascade-paths/852047#852047 "> حل مسارات شلال مشكلة معقدة ". لماذا ا؟ أين هي المخاطر؟ أين هي المشكلة؟

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

المحلول

لديك جدول تابع مع 2 مسارات سلسلة من نفس الأم: واحد "حذف" واحد "لاغية"

.

وماذا الأسبقية؟ ماذا تتوقع بعد ذلك؟ الخ

ملحوظة: A الزناد هو رمز ويمكن أن تضيف بعض المعلومات الاستخبارية أو شروط لسلسلة

نصائح أخرى

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

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

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

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

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

والنظر في جدول الموظفين:

CREATE TABLE Employee
(
    EmpID   INTEGER NOT NULL PRIMARY KEY,
    Name    VARCHAR(40) NOT NULL,
    MgrID   INTEGER NOT NULL REFERENCES Employee(EmpID) ON DELETE CASCADE
);

INSERT INTO Employees(     1, "Bill",   1);
INSERT INTO Employees(    23, "Steve",  1);
INSERT INTO Employees(234212, "Helen", 23);

والآن لنفترض بيل يتقاعد:

DELETE FROM Employees WHERE Name = "Bill";

وOoooppps. الجميع فقط حصلت أقال!

[<م> يمكننا مناقشة ما إذا كانت تفاصيل بناء الجملة صحيحة. يقف هذا المفهوم، على ما أعتقد. ]

وأعتقد أن المشكلة هي أنه عندما كنت جعل مسار واحد "ON تتالي حذف" والآخر "ON DELETE RESTRICT"، أو "NO ACTION" نتائج (النتيجة) هي unpredicable. ذلك يعتمد على أي حذف الزناد (وهذا هو أيضا الزناد، ولكن واحدا لم يكن لديك لبناء بنفسك) سيتم تنفيذها أولا.

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

و(1 الصف (الصفوف) تتأثر)

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

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