SQL الشرطية / العلبة الجمعيات / متعددة الأشكال؟
-
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 ، الاسم ، ...). هذا سيتطلب فقط انضمام واحد ، ولكن قد يعقد مناطق أخرى من مخططك ، على سبيل المثال. عضوية المستخدم في المنظمة.
تتمثل الطريقة البديلة في اتحاد الجداول والمؤسسات معًا ثم الانضمام مرة واحدة من الأحداث.
نصائح أخرى
ماذا عن نقل معلومات الملكية من Events
في اثنين من الجداول ، EventsUsers
و EventsOrganisations
(لكل منهما عمودان فقط ، FKS Events
وجدول امتلاك كائن مناسب)؟ إذا تستطيع UNION
اثنين من الاستعلامات ينضم كل منهما عبر جدول الانضمام إلى جدول الملكية.