SQL الشرطية / العلبة الجمعيات / متعددة الأشكال؟

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

  •  22-09-2019
  •  | 
  •  

سؤال

أحاول تنفيذ شيء مشابه لروبي على العلاقات المتعددة الأشكال. لدي الجداول الثلاثة التالية:

أحداث المستخدمين منظمات

يمكن أن يكون الحدث مالكًا إما بواسطة مستخدم أو مؤسسة ، لذلك يتضمن جدول الأحداث الخاص بي الأعمدة: owner_type و owner_id.

يمكنني بسهولة إدراج جميع الأحداث التي تنتمي إلى المستخدمين أو المؤسسات من خلال انضمام داخلي ، ومع ذلك ، هناك طريقة لجعل جدول الانضمام مشروطًا بناءً على قيمة عمود المالك ، مما يسمح بإدراج جميع الأحداث معًا ، بغض النظر عن المالك؟

وآمل أن يجعل الشعور.

أي نصيحة موضع تقدير.

شكرًا.

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

المحلول

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

select e.id, coalesce(u.name, o.name) owner_name
from events e
left join users u on e.owner_id = u.id and e.owner_type = 'user'
left join organisations o on e.owner_id = o.id and e.owner_type = 'org'

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

تتمثل الطريقة البديلة في اتحاد الجداول والمؤسسات معًا ثم الانضمام مرة واحدة من الأحداث.

نصائح أخرى

eventowner_model_01



  • Owner لديه أعمدة شائعة لجميع أنواع المالكين.
  • Person و Organization لديك أعمدة محددة لكل واحد.

ماذا عن نقل معلومات الملكية من Events في اثنين من الجداول ، EventsUsers و EventsOrganisations (لكل منهما عمودان فقط ، FKS Events وجدول امتلاك كائن مناسب)؟ إذا تستطيع UNION اثنين من الاستعلامات ينضم كل منهما عبر جدول الانضمام إلى جدول الملكية.

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