القضاء على طاولة الانضمام في علاقات hasmany في القضبان

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

سؤال

أفكر في طرق لإنشاء نظام التحكم في الوصول القائم على الدور في القضبان. لقد رأيت هذه المشاريع الرائعة أيضًا (من بين أمور أخرى):

سؤالي هو ، هل من الضروري حقًا أن يكون لديك جدول انضمام لكل شيء؟ إذا كنت واحدة من الجداول في العلاقة لا تحتوي إلا على قيم قليلة (قل أقل من 100) ، فلا يمكنني دمج جدول الانضمام مع هذا الجدول الصغير؟) هذا ما أعنيه ... إليك ما أحتاجه:

عارضات ازياء

  • المستعمل
  • مجموعة
  • دور
  • الإذن
  • Userroles/أدوار الأدوار
  • Grouproles
  • عضوية (GroupUsers)
  • rolepermissions

شئ مثل هذا...

الطريقة Rolerequirement الأعمال من خلال إنشاء ملف roles الجدول و roles_users انضم إلى الجدول. هذا يعني أنه إذا كان لدي 20 أدوارًا إجمالية ممكنة في التطبيق ، فلدي لدي

  • جدول الدور مع 20 صف
  • جدول أدوار مع صفوف n.

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

create_table "roles", :force => true do |t|
  t.string "name"
end

create_table "roles_users", :id => false, :force => true do |t|
  t.integer "role_id"
  t.integer "user_id"
end

مع هذا الشخص...

create_table "roles", :force => true do |t|
  t.string "name"
  t.integer "user_id" # or some polymorphic form
end

قد يتسبب ذلك Role.unique للعثور على جميع الأدوار الفريدة (للتخلص من طاولة 20 صفًا) ، لماذا يقوم الناس بإنشاء جدول الانضمام؟

نفس الشيء مع الأذونات: من المحتمل أن يكون لدي فقط 4 أذونات للبدء: create read update delete. لذلك لست بحاجة إلى جدول أذونات وجدول ROLES_PERMISSIONS ، يمكنني فقط تكرار أذونات CRUD والحصول على دور _id في جدول الأذونات. نفس الشيء مع المجموعة ، لست بحاجة إلى أدوار جماعية إذا كان لدي أعمدة متعددة الأشكال في بلدي roles الطاولة.

ما هي الطريقة الموصى بها للقيام بذلك؟

هنا مقتطف للهجرة المقترحة.

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

المحلول

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

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

لا يوضح سؤالك أن لديك أي حاجة لإلغاء تحديدها. بدلاً من ذلك ، فإنه يظهر نفورًا مضللاً على وجود طاولات "إضافية" ، وتجنب انضمام بسيط. يكلف البيانات المكررة أكثر من مجرد مساحة ، فإنه يكلف أيضًا الأداء (فريد من نوعه ليس هدية مجانية). RDBMs الحديثة مهارة تماما في المناولة.

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

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

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