سؤال

لدي عدة أنواع من الكيانات، لكل منها حقول خاصة بها، والتي يتم تخزينها في جداول منفصلة.
قد يكون كل سجل في هذا الجدول متصلاً بسجلات صفرية أو أكثر في جدول مختلف، أي مرتبط بسجلات من أنواع كيانات مختلفة.
إذا استخدمت جداول البحث، سأحصل على (m(m-1))/2=O(m^2) جداول بحث منفصلة تحتاج إلى التهيئة.
في حين أنه لا يزال ممكنًا لـ 6 أو 7 أنواع مختلفة من الكيانات، هل سيظل مناسبًا لأكثر من 50 نوعًا من هذا النوع؟
على وجه الخصوص، سيحتاج سجل معين إلى روابط لمعظم أنواع الكيانات الأخرى، لذلك من الناحية النظرية، سأتعامل مع رسم بياني شبه كامل وغير موجه وذو جوانب n.
هل يمكن لأي شخص إلقاء بعض الضوء على كيفية تخزين هذه البنية في نظام إدارة قواعد البيانات العلائقية؟
(أنا أستخدم Postgresql إذا كان الأمر مهمًا، ولكن أي حلول لأنظمة إدارة قواعد البيانات الأخرى ستكون مفيدة بنفس القدر).
شكرا لك على وقتك!

يوفال

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

المحلول

هذا هو رسم الخرائط الارتباطية للكائنات، وهي مشكلة صعبة بشكل كلاسيكي.أنت حقًا بحاجة إلى أداة ORM للقيام بذلك بشكل صحيح، وإلا ستدفعك إلى الجنون.

تعد مشكلة الاتصال التي تشير إليها إحدى المزالق، وتحتاج إلى تحسين دقيق للغاية وضبط الاستعلام، وإلا فإنها ستؤدي إلى توقف الأداء (على سبيل المثال.مشكلة N+1 SELECT).

لا يمكنني أن أكون أكثر تحديدًا دون معرفة النظام الأساسي للتطبيق الخاص بك - نظام إدارة قواعد البيانات الفعلي المستخدم ليس له صلة بالمشكلة حقًا.

نصائح أخرى

يمكنك استخدام نوع أساسي مشترك لجميع أنواع الكيانات، والتعامل مع العلاقات من خلال هذا النوع الأساسي - وهذا شيء يمكن لأي أداة ORM فعله تقريبًا باستخدام عمود التمييز وعلاقات المفاتيح الخارجية (على الرغم من أنني لست على دراية بـ CLSA).

يتركك هذا الأسلوب مع جدول علاقة واحد بالضبط.

يحرر: هذه هي الطريقة التي قمت بإعداد هذا:

CREATE TABLE base (
  id int(10) unsigned NOT NULL auto_increment,
  type enum('type1','type2') NOT NULL,
  PRIMARY KEY  (id)
);

CREATE TABLE type1 (
  id int(10) unsigned NOT NULL,
  PRIMARY KEY  (id),
  CONSTRAINT FK_type1_1 FOREIGN KEY (id) REFERENCES base (id)
);

CREATE TABLE type2 (
  id int(10) unsigned NOT NULL,
  PRIMARY KEY  (id),
  CONSTRAINT FK_type2_1 FOREIGN KEY (id) REFERENCES base (id)
);


CREATE TABLE x_relations (
  from_id int(10) unsigned NOT NULL,
  to_id int(10) unsigned NOT NULL,
  PRIMARY KEY  (from_id,to_id),
  KEY FK_x_relations_2 (to_id),
  CONSTRAINT FK_x_relations_1 FOREIGN KEY (from_id) REFERENCES base (id),
  CONSTRAINT FK_x_relations_2 FOREIGN KEY (to_id) REFERENCES base (id) 
  ON DELETE CASCADE ON UPDATE CASCADE
);

لاحظ عمود التمييز (type) مما سيساعد حل ORM الخاص بك في العثور على النوع الفرعي الصحيح للصف (type1 أو type2).يجب أن تحتوي وثائق ORM على قسم حول كيفية تعيين تعدد الأشكال باستخدام جدول أساسي.

الخيار الآخر هو استخدام قاعدة بيانات موجهة للكائنات مثل db40 أو ذاكرة التخزين المؤقت.قد يتم النظر في هذا إذا لم يكن الأداء مصدر قلق كبير وكنت مصممًا على تخزين الرسم البياني للكائن بالكامل.

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