JSON массив для улучшения отношений один ко многим - PullRequest
1 голос
/ 23 декабря 2019

У меня есть база данных с тремя таблицами:

Lemma          LemmaScrittura        LemmaSignificato
-------------  -----------------    ------------------
|id         |  | id             |   | id             |
|category.  |  | writing_1      |   | meaning_ITA    |
|frequency  |  | writing_2      |   | meaning_EN     |
|antonym.   |  | id_Headword(FK)|   | id_Headword(FK)|
-------------  ------------------   ------------------

Отношения: 1 Лемма -> Многие LemmaScrittura 1 Лемма -> Многие LemmaSignificato

Я пытаюсь представить эти таблицы вJSON для отправки этой информации в мое приложение для iOS;но у меня проблема с синхронизацией.

API Вот код, который я использую для создания API:

read.php

<?php
header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json; charset=UTF-8");

include_once("../objects/lemma.php");
include_once("../objects/lemmaScrittura.php");
include_once("../config/database.php");

$lemmaObj = new Lemma();
$stmt = $lemmaObj->read();
$num = $stmt->num_rows;

$scritturaObj = new LemmaScrittura();

if($num > 0){
    $lemmaArr = array();
    while($row = mysqli_fetch_array($stmt)){
        extract($row);

        $lemma=array(
            "ambitoUso"         =>  $ambito_Uso,
            "catGramm"          =>  $cat_Gramm,
            "confrontaCon"      =>  $confrontaCon,
            "contrario"         =>  $contrario,
            "frequenza"         =>  $frequenza,
            "kanjiRef"          =>  $kanji_ref,
            "noKanjiLemmaID"    =>  $no_Kanji_Lemma_ID,
            "subCatGramm"       =>  $sub_cat_Gramm,
            "xRef"              =>  $x_ref
        );
        array_push($lemmaArr, $lemma);
    }
        // set response code - 200 OK
    http_response_code(200);

    // show products data in json format
    echo json_encode($lemmaArr);

}else{
    // set response code - 404 Not found
    http_response_code(404);

    // tell the user no products found
    echo json_encode(
        array("message" => "No headwords found.")
    );
}

?>

файл database.php - это файлсоздать соединение с БД.

Чтобы попробовать API, я использую Postman, и когда я вызываю этот API, запрос длится 80-90мс. но если добавить вторую таблицу, то все изменится.

<?php
header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json; charset=UTF-8");

include_once("../objects/lemma.php");
include_once("../objects/lemmaScrittura.php");
include_once("../config/database.php");

$lemmaObj = new Lemma();
$stmt = $lemmaObj->read();
$num = $stmt->num_rows;

$scritturaObj = new LemmaScrittura();

if($num > 0){
    $lemmaArr = array();
    while($row = mysqli_fetch_array($stmt)){
        extract($row);

        $lemma=array(
            "ambitoUso"         =>  $ambito_Uso,
            "catGramm"          =>  $cat_Gramm,
            "confrontaCon"      =>  $confrontaCon,
            "contrario"         =>  $contrario,
            "frequenza"         =>  $frequenza,
            "kanjiRef"          =>  $kanji_ref,
            "noKanjiLemmaID"    =>  $no_Kanji_Lemma_ID,
            "subCatGramm"       =>  $sub_cat_Gramm,
            "xRef"              =>  $x_ref
        );
        //Thi is the second Table in which I pass the id of Lemma to get the row of LemmaScrittura that has id_Lemma == ID.
        $stmtScrittura = $scritturaObj->read($id);
        $scritturaNum = $stmtScrittura->num_rows;
        if($scritturaNum > 0){
            $scrittureArr = array();
            while($rowScritture = mysqli_fetch_array($stmtScrittura)){
                extract($rowScritture);
                $scrittura = array(
                    "lemmaKanji"    =>  $lemma_Kanji,
                    "lemmaKana"     =>  $lemma_Kana,
                    "lemmaRomaji"   =>  $lemma_Romaji,
                    "lemmaRomaji_1" =>  $lemma_Romaji_1,
                    "lemmaVideo"    =>  $lemma_Video
                );
                array_push($scrittureArr, $scrittura);
            }
            $lemma["scrittura"] = $scrittureArr;
        }


        array_push($lemmaArr, $lemma);
    }
        // set response code - 200 OK
    http_response_code(200);

    // show products data in json format
    echo json_encode($lemmaArr);

}else{
    // set response code - 404 Not found
    http_response_code(404);

    // tell the user no products found
    echo json_encode(
        array("message" => "No headwords found.")
    );
}

?>

Если я вызову этот API, в котором получим строку второй таблицы, запрос длится 45-50 секунд. очевидно, если я добавлю и третью таблицу, увеличение продолжительности.

Лемма содержит +7300 строк, а LemmaScrittura содержит +7600 строк. Мои вопросы:

1) Это нормально? 2) Как я могу улучшить API, чтобы сделать запрос быстрее? 3) Я в localhost, отличается ли я от реального сервера? Может ли это быть быстрее?

Большое спасибо.

ps Если вам нужна дополнительная информация, спросите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...