سؤال

أنا تصميم مخطط 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 -->

وبعبارة أخرى، فإن طريقة عمل الجمعيات متعددة الأعمدة هي عكس اتجاه المرجع.

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