كيفية منع السجلات المعزولة في الجداول التفصيلية لقاعدة البيانات المقيسة؟

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

  •  19-08-2019
  •  | 
  •  

سؤال

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

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

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

لقد فكرت في الطرق التالية للتعامل مع هذا:

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

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

  • تعامل مع السجل اليتيم، وقم بمهمة صيانة دورية لتنظيف جميع جداول التفاصيل.

ما هي الطريقة المفضلة للتعامل مع تغييرات البيانات في جداول التفاصيل المرتبطة بعدة جداول رئيسية؟أي نصائح لقراءة هذا؟

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

المحلول

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

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

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

نصائح أخرى

تعامل مع السجل اليتيم، وقم بمهمة صيانة دورية لتنظيف جميع جداول التفاصيل.

أعتقد أنك تعمل على تشويش حالات الحذف والتحديث.

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

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

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