سؤال

أنا في الآونة الأخيرة هاجر حياتي DB من myisam أن ك innodb.أنا جديدة إلى حد ما كل هذا حتى لدي سؤال فيما يتعلق باستخدام المفتاح الخارجي.

دعونا نقول لدي جدولين:مستخدمي الرسائل.

المستخدمين

id (pr_key)
name

رسائل

id (pr_key)
user_id
message

معرف المجالات سواء السيارات زيادة.

حتى الآن في الاستفسارات بلدي أنضم إلى هذه الجداول 2 بالفعل.غير أنه لا يزال من الضروري وضع الأجنبية الرئيسية هنا, في الواقع أنا لا أرى نقطة.هل لها مزايا الأداء.

إذا اخترت وضع الأجنبية الرئيسية هنا أفترض أنني يجب أن تجعل pr_key من الرسائل كل معرف ، user_id.

سيتم إضافة أخرى prim_key لا تأخذ فقط مساحة أكبر ، مما أدى إلى تباطؤ الأداء.

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

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

شكرا لك!

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

المحلول

وقد سلامة البيانات الفوائد.

فإنه سيتم إيقاف تطبيق قانون من دخول user_id 1234 في رسالة الجدول عندما لا يكون هناك مستخدم id = 1234 في الجدول المستخدم.وأنه سيتم إيقاف التطبيق من حذف المستخدم عندما يقوم المستخدم لديه أي رسائل في رسالة الجدول.

اسم PK لا يجب أن يطابق اسم FK في الرجوع الطفل الجدول.

"إذا اخترت وضع الأجنبية الرئيسية هنا أفترض أنني يجب أن تجعل pr_key من الرسائل كل معرف ، user_id."

لا.لا تغيير المفتاح في الرسائل يمكنك فقط إنشاء مفتاح خارجي (FK) قيدا على User_Id عمود في رسائل الجدول ، أن المراجع (نقطة) معرف العمود في الجدول المستخدمين.لا PK مطلوب في الرسائل منذ PK هو بالفعل فريدة من نوعها (لا يمكنك الحصول على رسالتين مع نفسه messageId) جعل PK على كل معرف user_id لا يمكن إضافة المزيد من التفرد.)

بيت القصيد هنا هو أنه قد يكون أساسيا سوء فهم حول ما مفتاح أساسي و الأجنبية الرئيسية هي في الواقع.

  • PK قيدا على تفرد صف واحد ، فإنه يتطلب فهرس.
  • FK قيدا على قيمة عمود (من ولايات قيمة وجود PK قيمة في الجدول المشار إليه) فإنه لا لا تتطلب فهرس.

@نوح, تحقق من هذا أخرى لذلك السؤال

نصائح أخرى

وإذا كنت إنشاء قاعدة المفتاح الخارجي رسمية بشأن رسائل (USER_ID) أم لا، فإن الحقيقة البسيطة هي أن هذا هو علاقة مفتاح خارجي.

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

والثانية، وتشارلز سبق إعلان المفتاح الخارجي على الرسائل (USER_ID) أن مراجع المستخدمين (معرف) تسمح لك لضمان سلامة البيانات الخاصة بك. عن طريق قيد مفتاح خارجي يمكنك تحديد ما يجب القيام به عند حذف سجل في الجدول المستخدمين التي لديها سجلات المناظرة في الجدول الرسائل. اختياراتك يتم حذف CASCADE (حذف كافة السجلات التابعة لهذا السجل المستخدم)، ON DELETE RESTRICT (لا تسمح للمستخدم يتم حذف التي لديها سجلات في الجدول الرسائل)، ON DELETE NO ACTION (تجاهل عمليات حذف) ، ON NULL SET DELETE (يحافظ على سجلات طفل ولكن يحدد مجال USER_ID إلى NULL).

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

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

وCharles Bretana - والسؤال هل تصل إلى غير محددة إلى Microsoft SQL Server. والسؤال هنا هو حول الخلية / ك InnoDB.

وأود أن أوصي بأن نظرتم الى وثائق <وأ href = "http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html" يختلط = "نوفولو noreferrer "> القيود الرئيسية ك InnoDB الخارجية .

<اقتباس فقرة>   

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

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