سؤال

هناك عدة أنواع من الكائنات في النظام و كل من لديه هو نفسه الجدول في قاعدة البيانات.يجب أن يكون المستخدم قادرا على التعليق على أي منهم.كيف يمكنك تصميم التعليقات الجدول(ق) ؟ أستطيع أن أفكر في عدد قليل من الخيارات:

  1. أحد التعليقات الجدول مع FK عمود لكل نوع الكائن (ObjectAID, ObjectBID, الخ)
  2. عدة تعليقات الجداول واحد لكل نوع الكائن (ObjectAComments, ObjectBComments, الخ)
  3. واحدة عامة FK (ParentObjectID) مع عمود آخر للإشارة إلى نوع ("ObjectA")

والتي سوف تختار ؟ هل هناك طريقة أفضل أنا لا أفكر ؟

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

المحلول

@palmsey

الى حد كبير, ولكن الاختلاف على هذا النمط الذي رأيت في معظم الأحيان يتخلص من ObjectAID وآخرون. ParentID يصبح كلا من PK و FK إلى Parents.أن يحصل لك شيء من هذا القبيل:

  • Parents

    • ParentID
  • ObjectA

    • ParentID (FK و PK)
    • ColumnFromA NOT NULL
  • ObjectB

    • ParentID (FK و PK)
    • ColumnFromB NOT NULL

Comments ستبقى على حالها.ثم أنت بحاجة فقط إلى تقييد معرف الجيل حتى لا بطريق الخطأ تصل الرياح مع ObjectA الصف ، ObjectB صف كل من نقطة إلى نفس Parents الصف ؛ أسهل طريقة للقيام بذلك هو استخدام نفس تسلسل (أو أيا كان) التي تستخدمها Parents بالنسبة ObjectA و ObjectB.

يمكنك أيضا نرى الكثير من المخططات مع شيء من هذا القبيل:

  • Parents
    • ID
    • SubclassDiscriminator
    • ColumnFromA (nullable)
    • ColumnFromB (nullable)

و Comments سوف تظل دون تغيير.ولكن الآن لا يمكن فرض كل القيود التجارية (الفئات الفرعية' خصائص كل nullable) دون كتابة مشغلات أو يفعل ذلك في طبقة مختلفة.

نصائح أخرى

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

@هانك مثلي الجنس

حتى شيء من هذا القبيل:

  1. ObjectA
    • ObjectAID
    • ParentID
  2. ObjectB
    • ObjectBID
    • ParentID
  3. تعليقات
    • CommentID
    • ParentID
  4. الآباء
    • ParentID

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

واحدة من الأشياء أنا أحب القيام به هو الحصول على جداول منفصلة التي تربط عام/الجدول المشترك أن جميع فردية الجداول.

لذا الكائنات فو وبار ثم تعليقات على فو & Bar, سيكون لديك شيء من هذا القبيل:

  • فو
    • فو معرف (PK)
  • شريط
    • شريط معرف (PK)
  • التعليق
    • التعليق معرف (PK)
    • نص التعليق
  • FooComment
    • فو معرف (PK FK)
    • التعليق معرف (PK FK)
  • BarComment
    • شريط معرف (PK FK)
    • التعليق معرف (PK FK)

هذا الهيكل:

  1. يتيح لك مشترك التعليقات الجدول
  2. لا تتطلب DB مع الجدول الميراث
  3. لا تلوث فو و شريط الجداول مع التعليق على المعلومات ذات الصلة
  4. يتيح لك إرفاق تعليق متعددة الكائنات (التي يمكن أن تكون المرغوب)
  5. يتيح لك إرفاق خصائص أخرى إلى تقاطع Foo/شريط التعليق إذا رغبت في ذلك.
  6. لا يزال يحافظ على العلاقات مع معيار (أي:سريعة وبسيطة وموثوق بها) مفاتيح خارجية
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top