Ich habe eine MySQL-Abfrage, die ich mit PHP verwende, um hierarchisches JSON für einen d3.js-Baum/Dendrogramm zu erstellen.
Fiddle zum Anzeigen des Schemas und vorhandener Abfragen.
Ich denke jetzt darüber nach, wie ich eine zus?tzliche Datenbeziehung D zwischen ProgrammergebnisdatenO und EinheitendatenU und Entwicklungsebenendaten hinzufügen kann, bei der es sich um eine Viele-zu-Viele-Beziehung handelt.
Es gibt nur drei Arten von D, wie im Bild unten gezeigt.
Konzeptzeichnung, die ich brauche:
Jedes U ist nur mit einem D von jedem O verbunden (aus Gründen der übersichtlichkeit wird nur ein O-Zweig angezeigt).
Du musst also ein Nachkomme von D und ein Enkel von O sein. Für andere O-Zweige kann dasselbe U den gleichen oder einen anderen Typ von D haben.
Wie Sie in der Geige sehen k?nnen, wird die Beziehung zwischen O und U derzeit über eine Nachschlage-/Beziehungstabelle program_outcome_unit_lookup
implementiert.
Au?erdem ist es m?glich, die Nachschlagetabelle zu ?ndern, sodass Sie anstelle der program_outcome_unit_lookup
-Tabelle zwei Nachschlagetabellen haben k?nnen, die m?glicherweise funktionieren:
O -> U
D -> U
Irgendwelche Ideen, wie man das erreichen kann?
Das PHP nach der Abfrage (nicht in der Datenbank-Fiddle...) lautet wie folgt, ist jedoch m?glicherweise nicht für die L?sung relevant, da es sich im Wesentlichen um ein Datenbankproblem handelt.
$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);
Aktualisiert
Sehen Sie sich das erweiterte Konzeptdiagramm mit zwei Zweigen an:
您的模型似乎是:每個(唯一)元組 (O, U)
都被分配了一個強制值 D
。
您可以通過向 program_outcome_unit_lookup
表添加 D
列來實現(xiàn)此模型:
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)
也可以是您的主鍵,但無論哪種方式,它都必須是唯一的(您當前沒有強制執(zhí)行此約束)。
現(xiàn)在,每個 U
都可以是任意多個 O
的成員,但根據(jù)要求,“每個 U
將僅與每個 D
關聯(lián)”。
例如從更新的圖表中存儲 U1
(O1-D2-U1
和 O2-D1-U1
),您可以將值 ((1,2,1),(2,1, 1))
。根據(jù)要求,您還不能添加例如O2-D2-U1
,因為它會違反唯一約束。
您還應該為 D
添加一個新表。如果不是每個 O
都允許使用每個 D
(例如,如果不允許 O2
分支使用 D1
),則還需要一個表 (O, D)
,否則沒有必要。