طاولات إضافية أو غير محددة الخارجية المفاتيح ؟
-
09-06-2019 - |
سؤال
هناك عدة أنواع من الكائنات في النظام و كل من لديه هو نفسه الجدول في قاعدة البيانات.يجب أن يكون المستخدم قادرا على التعليق على أي منهم.كيف يمكنك تصميم التعليقات الجدول(ق) ؟ أستطيع أن أفكر في عدد قليل من الخيارات:
- أحد التعليقات الجدول مع FK عمود لكل نوع الكائن (ObjectAID, ObjectBID, الخ)
- عدة تعليقات الجداول واحد لكل نوع الكائن (ObjectAComments, ObjectBComments, الخ)
- واحدة عامة 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 النقطة المشتركة الجدول الأصل.
@هانك مثلي الجنس
حتى شيء من هذا القبيل:
- ObjectA
- ObjectAID
- ParentID
- ObjectB
- ObjectBID
- ParentID
- تعليقات
- CommentID
- ParentID
- الآباء
- ParentID
كن حذرا مع عامة المفاتيح الخارجية التي لا تشير بالضبط إلى طاولة واحدة.أداء الاستعلام يعاني بشكل كبير إذا كان لديك لتقسيم حيث شرط على نوع نقطة إلى عدة جداول مختلفة.إذا كان لديك سوى عدد قليل من الأنواع ، وعدد من أنواع سوف تنمو لا بأس أن يكون مستقلا nullable الخارجية مفاتيح جداول مختلفة ، ولكن إذا كان سيكون لديك المزيد من أنواع إنه من الأفضل أن تأتي مع مختلف نموذج البيانات (مثل @palmsey اقتراح).
واحدة من الأشياء أنا أحب القيام به هو الحصول على جداول منفصلة التي تربط عام/الجدول المشترك أن جميع فردية الجداول.
لذا الكائنات فو وبار ثم تعليقات على فو & Bar, سيكون لديك شيء من هذا القبيل:
- فو
- فو معرف (PK)
- شريط
- شريط معرف (PK)
- التعليق
- التعليق معرف (PK)
- نص التعليق
- FooComment
- فو معرف (PK FK)
- التعليق معرف (PK FK)
- BarComment
- شريط معرف (PK FK)
- التعليق معرف (PK FK)
هذا الهيكل:
- يتيح لك مشترك التعليقات الجدول
- لا تتطلب DB مع الجدول الميراث
- لا تلوث فو و شريط الجداول مع التعليق على المعلومات ذات الصلة
- يتيح لك إرفاق تعليق متعددة الكائنات (التي يمكن أن تكون المرغوب)
- يتيح لك إرفاق خصائص أخرى إلى تقاطع Foo/شريط التعليق إذا رغبت في ذلك.
- لا يزال يحافظ على العلاقات مع معيار (أي:سريعة وبسيطة وموثوق بها) مفاتيح خارجية