用于一对多关系改进的 JSON 数组



我有一个包含三个表的数据库:

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

关系: 1 引理 -> 许多引理 1 引理 -> 许多引理

符号我正在尝试用JSON表示这些表,以将这些信息发送到我的iOS应用程序; 但我有一个计时问题。

应用程序接口 这是我用来制作 API 的代码:

阅读.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.")
);
}
?>

数据库.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 行,引理包含 +7600 行 我的问题是这些:

1(正常吗? 2(如何改进 API 以使请求更快? 3(我在本地主机中,如果我在真实服务器上会有所不同吗?可以更快吗?

谢谢。

附言如果您需要更多信息,请询问。

你发出了太多的数据库请求! 使用其他表«id_Headword»(或其他表(中的索引创建视图或执行由联接查询组成的选择查询。喜欢:

SELECT L.*, LS.writing_1 AS ls_writing_1, LS.writing_2 AS ls_writing_2, 
LSG.meaning_ITA AS lsg_meaning_ITA, LSG.meaning_EN AS lsg_meaning_EN 
FROM Lemma AS L 
INNER JOIN LemmaScrittura AS LS
ON(L.id = LS.id_Headword)
INNER JOIN LemmaSignificato AS LSG
ON (L.id = LSG.id_Headword)

您可以使用«作为»重命名其他数据表的列。然后你有一个有组织的代码和结果。

如果你想把所有的行放在一个地方,这样做(第一个值;第二个值;第三个值;等等(:

SELECT L.*, 
GROUP_CONCAT(DISTINCT LS.writing_1 SEPARATOR ";") AS ls_writing_1,
GROUP_CONCAT(DISTINCT LS.writing_2 SEPARATOR ";") AS ls_writing_2,
GROUP_CONCAT(DISTINCT LSG.meaning_ITA SEPARATOR ";") AS lsg_meaning_ITA,
GROUP_CONCAT(DISTINCT LSG.meaning_EN SEPARATOR ";") AS lsg_meaning_EN
FROM Lemma AS L 
LEFT JOIN LemmaScrittura AS LS
ON(L.id = LS.id_Headword)LEFT JOIN LemmaSignificato AS LSG
ON (L.id = LSG.id_Headword)

之后在PHP中,您可以轻松地恢复所有内容,并且只需在它们之间交叉数据即可。(第一行;第二行等(

为了降低速度,您可以将所有数据保存在"json"文件中。 并将文件数据直接发送到您的 API。然后,如果有任何更改,您将更新文件(使用按钮、cron 等(。

服务器和本地主机之间可能减慢速度的区别在于带宽以及用户请求和等待服务器响应的请求数。所以在本地,它要快得多。

祝你好运

最新更新