كيف تقوم بتطبيع العلاقات الفردية أو الأخرى؟
-
21-09-2019 - |
سؤال
أقوم بتخزين بيانات عن إحصائيات البيسبول وأرغب في القيام بذلك مع ثلاثة طاولات: اللاعبين ، 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 من جداول الإحصائيات.
ولكن على الأرجح على الأرجح من المعدن أكثر مما تريد.