سؤال

أقوم بتخزين بيانات عن إحصائيات البيسبول وأرغب في القيام بذلك مع ثلاثة طاولات: اللاعبين ، BATTINGSTATS ، و PITCHINGSTATS. لغرض السؤال ، سيكون لكل لاعب إحصائيات الضرب أو الإحصائيات ، ولكن ليس كلاهما.

كيف يمكنني تطبيع هذه العلاقة في 3NF؟

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

المحلول

سيكون اللاعب مفتاحًا خارجيًا في كل من طاولات Battingstats و PitchingStats

وتذكر وضع بعض الأبعاد الزمنية (الموسم ، السنة ، وآخرون) في جداول الإحصائيات

وبالمناسبة ، هذا افتراض سيء: على حد علمي ، يُسمح للأباريق بالمضرب أيضًا!

نصائح أخرى

هل أنت مطلوب حقًا عدم استخدام أكثر من 3 جداول. تطبيع عادة ما ينطوي على تحطيم نموذج واحد غير طبيعي إلى العديد من العلاقات الطبيعية.

إذا كان بإمكانك الحصول على أكثر من 3 جداول ، فقد ترغب في النظر في ما يلي (في 3nf):

Players:        ([player_id], name, date_of_birth, ...)
Batters:        ([batter_id], player_id)
Pitchers:       ([pitcher_id], player_id)
Batting_Stats:  ([batter_id, time_dimension], stat_1, stat_2, ...)
Pitching_Stats: ([pitcher_id, time_dimension], stat_1, stat_2, ...)

سمات في [] تحديد المفتاح الأساسي ، ولكن أ مفتاح بديل يمكن استخدامها إذا كانت مفضلة. ال player_id السمة في المقاتلين والملاعب يجب أن يكون قيود فريدة, ، ويجب أن يكون أيضا مفتاح غريب لعلاقة اللاعبين. يجب أن يكون لـ BATTING_STATS و PITTING_STATS مفتاحًا خارجيًا للبطاقات والترويج على التوالي.

لاحظ أن ما ورد أعلاه لا ينفذ أن اللاعب يمكن أن يكون مجرد خليط أو مجرد إبريق.


تحديث:

إحدى الطرق التي أدركها لفرض أن اللاعب ليس سوى الخليط أو مجرد إبريق ، من خلال هذا النموذج:

Players:        ([player_id], name, date_of_birth, ...)
Roles:          ([role_id, role_type], player_id)
Batting_Stats:  ([role_id, role_type, time_dimension], stat_1, stat_2, ...)
Pitching_Stats: ([role_id, role_type, time_dimension], stat_1, stat_2, ...)

ال role_type يجب تحديد إبريق أو الخليط. يجب أن يكون لـ BATTING_STATS و PITCHING_STATS مفتاح خارجي مركب للأدوار باستخدام (role_id, role_type). قيود فريدة على player_id في الأدوار ، من شأن الأدوار أن يضمن أن يكون للاعب دورًا واحدًا واحدًا فقط. أضف أخيرا تحقق من القيود لهذا السبب. Batting_Stats.role_type = 'Batter' و Pitching_Stats.role_type = 'Pitcher'. ضمان قيود التحقق من أن BATTING_STATS تصف دائمًا الخليط ، ولاحظ إبريقًا. الأمر نفسه ينطبق على pitching_stats.

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

أو في جدول اللاعبين ، سجل نوع الإحصائيات التي لديهم ، ثم قم بتضمينها في علاقة FK من جداول الإحصائيات.

ولكن على الأرجح على الأرجح من المعدن أكثر مما تريد.

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