سؤال

السيناريو

ولدي 3 جداول قاعدة البيانات. واحد هو لصور والاثنان الآخران الناس والأماكن. وبما أن كل شخص يمكن أن يكون لها العديد من الصور وكل مكان يمكن أن يكون لها العديد من الصور، وأريد أن يكون واحد على العلاقة كثير بين الناس والصور، وكذلك الأماكن والصور.

سؤال

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

ومساعدة تقدير كبير.

والتحيات،

تحرير:

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

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

المحلول

وتحرير

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

People (PersonId, Name)
Places (PlaceId, Name)
Dogs (DogId, Breed)
Doors (DoorId, Height, Width)
Images (ImageId, ImageBinary, OwnerId, OwnerTable)

وأين OwnerTable هو اسم أو رمز للجدول الذي ينتمي إلى OwnerId.

وهذا من شأنه أن يوفر لك 20 FKS في الجدول صورة، أو الجداول 20 جمعية. ثم، في ينضم، يمكنك تحديد OwnerTable، اعتمادا على الجدول الذي ينضمون إليها.

وأنت في حاجة إلى استخدام أنواع CONVERTABLE لمعرفات (على سبيل المثال، TINYINT، SMALLINT، وINT)، ويفضل أن يكون نوع واحد للجميع (على سبيل المثال، INT)، والتي سيكون لإدارة التكامل المرجعي نفسك على الرغم من المشغلات أو بعض الدول الأخرى التعليمات البرمجية.

و/ تحرير

وتحتاج 5 الجداول، وليس 3:

People (PersonId, Name)
Places (PlaceId, Name)
Images (ImageId, ImageBinary)
ImagesPeople (ImageId, PersonId)
ImagesPlaces (ImageId, PlaceId)

ويمكنك استدعاء الحقول ما تريد. People.Id، ImagesPeople.PersonId، وما إلى ذلك.

ولكن ما لا يمكن القيام به هو شيء من هذا القبيل:

People (PersonId, Name)
Places (PlaceId, Name)
Images (ImageId, ImageBinary, PlaceOrPersonId)

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

وبدلا من ذلك:

Things (ThingId PK, Type)
People (ThingId PK/FK, Name, Age)
Places (ThingId PK/FK, Name, LatLon)
Images (ImageId PK, ImageBinary, ThingId FK)

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

وتحرير: بناء على اقتراح سيلون القط، سيناريو 4:

People (PersonId, Name)
Places (PlaceId, Name)
PeopleImages (PeopleImageId, ImageBinary)
PlaceImages (PlaceImageId, ImageBinary)

وهنا، والصور هي ملك خاص من قبل شخص واحد أو مكان. على غرار النسخة 2، ولكن مع المفاتيح الخارجية المعلنة. ربما تكون هناك بعض مزايا الأداء مقابل تصميم 5 الجدول، منذ أقل ينضم مطلوبة. تفقد "صورة" ككيان متميز، وحلت محلها "PeopleImage" و "PlaceImage".

نصائح أخرى

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

والآن من الناحية الفنية يمكنك الاتصال الخاصة بك الفهارس والجداول كل ما هو ليس كلمة محجوزة ولم يتم استخدامها بالفعل، س، ص، Z12345 ومتذبذبة كلها أسماء صالحة للفهرس.

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

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

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

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

وماذا عن

Person (PersonId PK, Name, ImageId FK)
Image (ImageId PK, Name)
Place (PlaceId PK, Name, ImageId FK)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top