سؤال

لدي جدول مع مجموعات من إعدادات المستخدمين, أنه يحتوي على الأعمدة التالية:

UserID INT
Set VARCHAR(50)
Key VARCHAR(50)
Value NVARCHAR(MAX)
TimeStamp DATETIME

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

يجب إنشاء مفتاح أساسي على ثلاثة أعمدة (userid, مجموعة, مفتاح) أو علي خلق المزيد من حقل مفتاح أساسي (على سبيل المثال تعداد عدد صحيح يسمى SettingID ، فكرة سيئة أعتقد) ، أو إنشاء مفتاح أساسي, و إنشاء فهرس فريد?

----- تحديث -----

فقط لتوضيح الأمور:هذا هو نهاية خط الجدول ، فإنه ليس انضم في أي حال.معرف المستخدم هو FK للمستخدمين الجدول.مجموعة ليست FK.هذا هو الى حد كبير المساعد طاولة بلدي واجهة المستخدم الرسومية.فقط كمثال:للمستخدمين الحصول على أول زيارة أقسام الموقع الالكتروني مساعدة البالون ، التي يمكن أن تغلق إذا كانوا يريدون.بمجرد النقر بعيدا, انا سوف تضيف بعض الإعداد إلى "GettingStarted" مجموعة من شأنها أن الدولة التي helpballoon X تم تعطيل.في المرة القادمة عندما يدخل المستخدم على نفس الصفحة ، ووضع الدولة التي تساعد بالون X لا ينبغي أن تظهر بعد الآن.

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

المحلول

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

هل يجب إنشاء مفتاح أساسي على جميع الأعمدة الثلاثة (userid, set, and key)

تأكد هذا واحد.

<ع> استخدام المفتاح الأساسي البديل سيؤدي إلى عمود إضافي التي لا تستخدم لأغراض أخرى.

وإنشاء UNIQUE INDEX جنبا إلى جنب مع مفتاح أساسي بديل هو نفس خلق PRIMARY KEY غير عنقودية، وسيؤدي إلى KEY lookup اضافية وهو أسوأ أداء ل.

وسوف إنشاء UNIQUE INDEX دون PRIMARY KEY يؤدي في جدول HEAP-organized والتي سوف تحتاج إلى RID lookup إضافية للوصول إلى القيم: أيضا ليست جيدة جدا

نصائح أخرى

وجود مركب مفاتيح فريدة من نوعها هو في الغالب ليس فكرة جيدة.

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

فمن الأفضل لإنشاء مركب مفتاح عدد التلقائي والتي ليس لديها أي الأعمال المعنى.

تحرير بعد التحديث:

في هذه الحالة, يمكنك التفكير في وجود من الناحية النظرية لا يوجد مفتاح أساسي, و جعل هذه الأعمدة الثلاثة إما مفتاح أساسي مركب مفتاح فريد (لجعلها قابلة للتغيير).

وكم من مفتاح وتعيين نفعل لديك؟ هل هذه الحاجة إلى أن يكون VARCHAR (50) أو يمكن أنها تشير إلى طاولة البحث؟ إذا يمكنك تحويل هذه مجموعة ومفتاح إلى SetId وKeyId ثم يمكنك إنشاء المفتاح الأساسي الخاص بك على القيم عدد صحيح (3) الذي سيكون أسرع بكثير.

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

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

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

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

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

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

ويكون أفضل معرف المستخدم إلى 32 بت NEWID () أو معرف فريد لهوية المستخدم ك int يعطي تلميحا إلى المستخدم من هوية المستخدم المحتمل. وهذا أيضا حل مشكلتك مفتاح مركب.

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