هل يمكن أن يحتوي جدول ربط متعدد إلى متعدد على أكثر من عمودين؟

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

سؤال

لدي بعض الجداول التي تستفيد من جداول متعدد إلى متعدد.على سبيل المثال جدول الفريق.

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

  • جدول الأعضاء (يحتوي على تفاصيل الفريق)
  • جدول المناصب (يحتوي على المناصب)
  • جدول member_to_positions (معرف العضو ومعرف المنصب)
  • member_to_previous_positions (معرف العضو ومعرف المنصب)

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

كل شيء مربك للغاية، وهذا التطبيع.

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

المحلول

من المشروع تمامًا أن يكون لديك جدول TeamPositionMember، مع الأعمدة

Team_Id
Position_Code
Member_Id
Start_Date
End_Date NULLABLE

وعمود معرف بديل للمفتاح الأساسي إذا كنت تريد ذلك؛وإلا فهو مفتاح أساسي مركب مكون من 3 حقول.(ستحتاج إلى قيد التفرد على هذا على أي حال.)

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

يحرر:

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

نصائح أخرى

نعم، يمكن أن يحتوي جدول الوصلات متعدد إلى متعدد على سمات (أعمدة) إضافية.

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

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

فكرتي الأولى:

امنح جدول فرق/أعضاء متعدد إلى متعدد عمود معرف.أصبح لكل علاقة بين الفريق والعضو الآن معرف.

ثم قم بإنشاء مناصب ربط متعدد إلى متعدد للعلاقات بين أعضاء الفريق.

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

الآن أصبح كل شيء جميلًا وجافًا، ويبدو أن كل عمليات الربط تعمل.هل يبدو هذا صحيحًا لأي شخص آخر؟

يبدو أنك بحاجة إلى مناصب متعدد إلى متعدد لجدول الفرق الآن.

يمكن أن يحتوي جدول team_to_member الخاص بك بالفعل على عمود إضافي Position_id لوصف (أو في هذه الحالة الإشارة إلى) المركز الذي يشغله العضو داخل هذا الفريق.

تخلص من member_to_previous_position طاولة.مجرد استخدام member_to_positions ولها هذه الأعمدة:

MemberToPositionID (autoincrement OK only)
MemberID
PositionID
StartDate
EndDate

ثم للعثور على المناصب الحالية، عليك القيام بما يلي:

select * 
from member_to_positions 
where EndDate is null
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top