سؤال

ما هي فائدة وجود جداول مفرق بين الأولين: م والثاني 1: M العلاقات في قاعدة البيانات التالية؟

نص Alt http://dl.getdropbox.com/u/175564/db/db-simple.png.

الكتاب أشجار جو Celko التسلسلات الهرمية في SQL يقول أن السبب هو أن يكون لها علاقات فريدة في 1: م. على سبيل المثال، تتطلب الجداول التالية من المستخدمين لطرح السؤال نفسه بالضبط مرتين وإعطاء نفس الإجابة مرتين على التوالي.

الأول 1: m العلاقة

users-questions
===============
user_id REFERENCES users( user_id )
question_id REFERENCES questions ( question_id )
PK( user_id, question_id)           // User is not allowed to ask same question twice 

الثاني 1: M العلاقة

questions-answers
=================
question_id REFERENCES questions( question_id)
answer_id REFERENCES answers( aswer_id )
PK( question_id, answer_id )       //  Question is not allowed to have to same answers

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

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

المحلول

عادة ما يكون بسبب ازدواجية البيانات.

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

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

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

insert into table (col1, col2) values (@id, @value) --NOTE: You would probably 
--make the id column an autonumber so you dont have to worry about this

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

نصائح أخرى

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

لا أتفق مع ما تقوله بشأن عدم وجود فائدة لمفاتيح مركبة فريدة من نوعها في طبقة الثبات لأنه يمكنك تطبيق ذلك في طبقة التطبيق، على الرغم من ذلك. قيود تفرد طبقة الثبات لديها الكثير من الفوائد الصعبة المتماثلة، مثل، في MySQL، القدرة على الاستفادة من INSERT ... ON DUPLICATE KEY UPDATE.

أوافق على أن جدول الانضمام لشخص واحد في هذا الموقف لا يبدو أنه يضيف الكثير من الفائدة، كما يقول Chaos، أنت في الواقع في نهاية المطاف تنفيذ العديد من الدعم إلى العديد من الدعم. لكن جو Celko هو رجل ذكي - هل هذه هي الإجابة الدقيقة حقا؟

أحد الأسباب الأخرى المحتملة الأخرى لتنفيذ جدول الانضمام على واحد إلى كثير هو أنه يفصل تماما عن الأسئلة / الإجابات من الاعتماد على المستخدمين.

على سبيل المثال، قل أنك أضفت Dogs الجداول و an. Deities جدول. نعلم جميعا أن الكلاب لا تستطيع التسجيل كمستخدمين لأنهم ليس لديهم عناوين بريد إلكتروني، ولم يسجل الآلهة كمستخدمين لأنه، حسنا، إنه تحتها. ربما لا تزال الكلاب والآلهة طرح الأسئلة، ولكن للقيام بذلك قد ترغب في تنفيذ طاولة أسئلة للكلاب وطاولة أسئلة للآلهة. من الناحية النظرية، لا يزال هذا كثير إلى كثير، ولكن في الممارسة العملية، يمكنك القيام بذلك حتى تتمكن من الحصول على العديد من واحد إلى آخر.

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