Rumah  >  Soal Jawab  >  teks badan

MySQL - hubungan hierarki kompleks - berbilang M:N?

Saya mempunyai pertanyaan MySQL yang saya gunakan dengan PHP untuk membina JSON hierarki untuk pepohon/dendrogram d3.js.

Biola untuk melihat skema dan pertanyaan sedia ada.

Saya kini berfikir tentang cara menambahkan hubungan data tambahan D antara data program_outcomeO dan data unitU dan data peringkat_pembangunan, yang merupakan hubungan banyak-ke-banyak.

Hanya ada tiga jenis D seperti gambar di bawah.

Lukisan konsep yang saya perlukan:

Setiap U hanya berkaitan dengan satu D setiap O (hanya satu O cawangan ditunjukkan untuk kejelasan).

Jadi U perlu menjadi keturunan D dan cucu O. Untuk cawangan O lain, U yang sama mungkin mempunyai jenis D yang sama atau berbeza.

Seperti yang anda lihat dalam biola, hubungan antara O dan U sedang dilaksanakan melalui jadual carian/perhubungan program_outcome_unit_lookup.

Selain itu, adalah mungkin untuk menukar jadual carian, jadi bukannya program_outcome_unit_lookup jadual, anda boleh mempunyai dua jadual carian, yang mungkin berfungsi:

O -> U

D -> U

Ada idea bagaimana untuk mencapai ini?

PHP selepas pertanyaan (bukan dalam biola pangkalan data...) adalah seperti berikut, tetapi mungkin tidak berkaitan dengan penyelesaian, ini pada dasarnya adalah isu pangkalan data.

$result = $connection->query($query);
$data = array();
while ($row = $result->fetch_object()) {
    $data[$row->global_id] = $row;
}

$roots = array();
foreach ($data as $row) {   
    $row->type = end(explode(",",(implode(array_slice(explode ( ':',  $row->global_id), -2, 1)))));
    if ($row->parent_global_id === null) {
        $roots[]= $row;
    } else {
        $data[$row->parent_global_id]->children[] = $row;
    }
    unset($row->parent_global_id);
    unset($row->global_id);
}

$json = json_encode($roots);

$json = trim($json, '[]');

$fp = fopen('data.json', 'w');
fwrite($fp, $json);
fclose($fp);

Dikemas kini

Lihat gambar rajah konsep yang diperluaskan dengan dua cabang:

P粉354948724P粉354948724203 hari yang lalu417

membalas semua(1)saya akan balas

  • P粉427877676

    P粉4278776762024-03-30 12:45:05

    Model anda nampaknya: setiap tuple (unik) (O, U) 都被分配了一个强制值 D.

    Anda boleh melaksanakan model ini dengan menambahkan lajur pada program_outcome_unit_lookup 表添加 D:

    CREATE TABLE `program_outcome_unit_lookup` (
      `program_outcome_unit_lookup_pk` int(6) NOT NULL AUTO_INCREMENT,
      `program_outcome_fk` int(2) NOT NULL,
      `devdata_fk` int(2) NOT NULL,
      `unit_fk` int(2) NOT NULL,
      PRIMARY KEY (`program_outcome_unit_lookup_pk`),
      UNIQUE KEY (`program_outcome_fk`, `unit_fk`)
    );

    (program_outcome_fk, unit_fk) juga boleh menjadi kunci utama anda, tetapi sama ada ia mestilah unik (anda tidak menguatkuasakan kekangan ini pada masa ini).

    Kini, setiap U 都可以是任意多个 O 的成员,但根据要求,“每个 U 将仅与每个 D persatuan”.

    Cth. kedai U1O1-D2-U1O2-D1-U1),您可以将值 ((1,2,1),(2,1, 1))。根据要求,您还不能添加例如O2-D2-U1 daripada graf yang dikemas kini, kerana ia akan melanggar kekangan unik.

    Anda juga harus menyediakan D 添加一个新表。如果不是每个 O 都允许使用每个 D (例如,如果不允许 O2 分支使用 D1),则还需要一个表 (O, D) untuk

    , jika tidak, ia tidak perlu. 🎜

    balas
    0
  • Batalbalas