سؤال

أقوم بعمل قاعدة بيانات لبرنامج حيث من المفترض أن أقوم بتصميم بعض العلاقات في الأسرة.السابق:x هو الأب إلى y ، y هو الابن إلى x

لذلك ، لدي أعضاء جدول مع كل المعلومات حول كل عضو لذلك فكرت في جعل الكثير من العلاقات بين أعضاء الجدول نفسه بحيث عضو سيحتوي جدول الجسر على الأعمدة "fk_fromid ، fk_toid" كمفتاح مركب (هل هذا صحيح؟) و "fk_relationType" كمفتاح خارجي ل العلاقات الجدول الذي سيكون له نوع العلاقة "الأب ، الأم ، الابن ، الابنة" ، وعلاقتين تصلان كوكالة واحدة من طاولة الأعضاء إلى هذين المفتاحين الأجنبيين

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

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

شكرًا جزيلاً على أي مساعدة ، وآسف على Bishoy الإنجليزية السيئة

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

المحلول

SQL لا تتعامل مع مشاكل "شبكة" مثل هذا جيد للغاية.

طاولة الجسر عضو عضو هو اسم فظيع. إنه جسر "عضو من الوالدين" (أو "الوالد والطفل"). لا ينبغي أن يكون لجداول الجسر "مفتاح مركب". تحتوي جداول الجسر على مفتاح بديل (مجرد رقم متسلسل) وزوج من مراجع FK إلى الجداول الأخرى. يجب أن يكون لدى FK's أسماء مثل "Member" و "Parent" لجعل الأمر واضحًا تمامًا ما هي العلاقة في هذا الجدول.

كل شخص لديه والد. ليس لدى الجميع أطفال. لن يكون لدى بعض الآباء آباء في قاعدة البيانات هذه ؛ إنهم "أفضل الوالدين".

من الأسهل إذا كان لدى أفضل الوالدين صفوفًا في جسر الوالدين والطفل مع الوالدين FK من NULL. وبهذه الطريقة ، تتجنب الانضمام الخارجي الفائق-كل عضو لديه صف واحد على الأقل من عضو واحد ؛ من الناحية المثالية اثنين.

ستجد العديد من مشكلات "ركوب الدراجات" لأن العلاقات متعدية.

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

لا ينجح حذف المتتالي بشكل جيد لأن العلاقات في الأسرة موجهة بطريقتين (أحد الوالدين للأطفال ، طفل للآباء) ، لكن SQL فقط له اتجاه واحد (مرجع FK).

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

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

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

نظرًا لأن SQL لا تفعل ذلك بشكل جيد ، يبدو أن جميع التصميمات تواجه مشاكل.

نصائح أخرى

  1. على افتراض أن كل عضو يمكن أن يكون له أم واحدة وأب واحد فقط ، فستتمكن من استخلاص جميع العلاقات من خلال الحفاظ على ملف mother_id و father_id حقل في members الطاولة.

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

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

  2. ال member_member الجسر الذي اقترحته لديه مشكلة خطيرة واحدة لأنه يعني اتجاه العلاقة ، بحيث إذا كان x هو والد y ، y هو أيضًا ابن X. لقد اقترحت تحديد العلاقة مرتين في كلا الاتجاهين ، ولكن بشكل عام هذا لا ينصح. هذا شكل من أشكال ازدواجية البيانات ، ويمكنك الكفاح من أجل فرض النزاهة المرجعية مع ازدواجية البيانات. تذكر أن DBMS لا يعرف أن X هو أب y هو نفسه y هو ابن X.

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

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