DB التصميم:متى يجب إجراء الفائقة من الصفات المشتركة?

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

  •  05-07-2019
  •  | 
  •  

سؤال

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

GradStudent:
firstName
lastName
birthDate
courseAssignment
researchGrant

ولكن فقط المعيدين سيكون الحال المهمة فقط مساعدي البحوث سوف يكون researchGrant, حتى واحد من هذين تكون دائما فارغة.ومن الواضح أن هذا ليس الحل الأمثل و سيكون من الأفضل أن تفعل هذا:

GradStudent:
firstName
lastName
birthDate

TeachAsst:
courseAssignment

ResearchAsst:
researchGrant

حيث TeachAsst و ResearchAsst يكون مفتاح خارجي (على الأرجح "studentID" البديل) من GradStudent الجدول.

أفهم أيضا لماذا لن يكون من الأفضل أن تجعل اثنين منفصلة تماما الجداول مثل:

TeachAsst:
firstName
lastName
birthDate
courseAssignment

ResearchAsst:
firstName
lastName
birthDate
researchGrant

لأنك تكرار الكثير من السمات التي لها نفس المعنى.

غير أن اثنين من فصول متميزة أن معنى (على ما أظن) إذا كان لديهم أي من المجالات المشتركة مثل:

TeachAsst:
name
courseAssignment
payRate
numStudents

ResearchAsst:
name
researchGrant
facultyAdvisor
researchTopic

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

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

تحرير:دعونا نفترض أن في طالب سبيل المثال ، طالب إما مدرس مساعد أو باحث مساعد ، لن تبديل الأدوار, و أيضا هو لا كل أو لا.

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

المحلول

أنا أعتبر نفسي جديدا نسبيا في تصميم قاعدة البيانات ، حتى تأخذ هذا ما يستحق.في المثال الأول ، فكرتي الأولى أن يكون في الواقع الحفاظ على فصل "GradStudent" الجدول الذي يشمل الاسم والمعلومات الشخصية الأخرى.في رأيي أنه يترك لك مرنة عن التغييرات المحتملة في المستقبل.على سبيل المثال ، ما إذا كان آخر GradStudent دور إنشاؤها والتي يمكن أن تعقد من قبل فرد بالإضافة إلى إما TeachAsst أو ResearchAsst?يمكنك إنشاء "GradStudent_Relationship" الجدول الذي يمكن أن تستوعب أدوار إضافية في المستقبل مثل:

GradStudent_Relationship:
GradStudent_ID (fk)
ResearchAsst_ID (fk)
TeachAsst_ID (fk)
NewGradStudentRole_ID (fk)

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

بخصوص المثال الثاني ، لماذا لا الكاميرا الصوت ؟ لا بعض الكاميرات الرقمية تسجيل الفيديو ويشمل ذلك الصوت ؟ أيضا, لماذا لا تستطيع الهاتف المحمول لديك عدسة أو العرض القياس ؟ لا العديد من الهواتف المحمولة الآن تشمل الكاميرات ؟

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

آمل أن يكون هذا على الأقل مفيدة إلى حد ما.

نصائح أخرى

في GradStudent السيناريو لديك الخاصية التالية:

أ GradStudent يمكن TeachAsst الأولى وتصبح ResearchAsst في وقت لاحق.أو أنها يمكن أن يكون على حد سواء في نفس الوقت.

في هذه الحالة ، denormalization قد لا يكون فكرة جيدة.

ولكن في الحالة الخاصة بك ، يمكنك قياس cameas والهواتف المحمولة.فإنها لن تصبح شيئا آخر.أعتقد أنك يمكن أن تخاطر denormalization أجل أقل تعقيد.

أو يمكن حتى التفكير باستخدام documend db مثل CouchDB, الذي لم يكن لديك لمتابعة أي مخطط.

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