الرجوع إلى مفاتيح أجنبية في نفس العمود
-
09-09-2019 - |
سؤال
أنا تصميم مخطط BD ل MySQL. يخزن DB الخاص بي 3 أنواع من النقاط: A، B أو C ومسار يتألف من النقاط N:
الطريق = [(a1 أو b1 أو c1؛ a2 أو b2 أو c2)، (a2 أو b2 أو c2؛ a3 أو b3 أو c3)، ...
create table a_points (
point_id serial not null,
owner_id bigint unsigned not null,
name varchar(20) not null,
primary key (point_id),
foreign key (owner_id) references othertable (other_id)
) engine = InnoDB;
create table b_points (
point_id serial not null,
owner_id bigint unsigned not null,
name varchar(20) not null,
fields varchar(20) not null,
primary key (point_id),
foreign key (owner_id) references othertable (owner_id)
) engine = InnoDB;
create table c_points (
point_id serial not null,
name varchar(20) not null,
cfields varchar(20) not null,
primary key (point_id)
) engine = InnoDB;
create table paths (
path_id serial not null,
name varchar(20) not null,
primary key (path_id)
) engine = InnoDB;
create table point_pairs (
pair_id serial not null,
path_id bigint unsigned not null,
point_from bigint unsigned not null,
point_to bigint unsigned not null,
table_from varchar(9) not null,
table_to varchar(9) not null,
primary key (pair_id),
foreign key (path_id) references paths (path_id)
) engine = InnoDB;
(*) زوج من النقطة (م، ن) أو من م إلى ن
لذلك أنا تخزن زوج من النقاط مع معرف المسار الخاص بهم. مشكلتي هي أنه اضطررت إلى إنشاء أعمدة تحدد الجداول "اسم M و N. table_from for m and table_to ل n. وبالتالي، يجب أن استخدم هذين العمودين في التعليمات البرمجية لمعرفة نوع النقاط المحفوظة في المسار (المسار وجدول Point_Pairs). سؤالي: هل توفر MySQL شيئا للإشارة إلى مفاتيح N الخارجية في نفس العمود؟ لقد فكرت بالفعل في الانضمام إلى جدول نقاط A و B و C ولكن يجب أن أضيف عمود من النوع إلى هذا الجدول الجديد وستصبح فئات PHP الخاصة بي عديم الفائدة.
شكرا مقدما!
المحلول
أنت تستخدم نمطا يسمى الجمعيات متعددة الأشكال، ولا، لا توجد طريقة للقيام بذلك واستخدام مفاتيح أجنبية لفرض تكامل المرجعية.
أقترح عليك جعل طاولة مشتركة واحدة a_points
, b_points
, ، و c_points
المرجعي. ثم يمكن أن تشير أزواج النقطة إلى أن الجدول المشترك.
a_points -->
b_points --> common_points <-- point_pairs
c_points -->
وبعبارة أخرى، فإن طريقة عمل الجمعيات متعددة الأعمدة هي عكس اتجاه المرجع.