为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
元芳怎么了 2022-07-02 15:47:47
我有一个包含三个表的数据库: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 的代码:读取.php<?phpheader("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);database.php 文件是创建与数据库的连接的文件。要尝试使用 Postman 的 api,当我调用此 API 时,请求会持续 80-90 毫秒。但如果添加第二个表所有更改。如果我调用这个 API 来获取第二个表的行,请求会持续 45-50 秒。显然,如果我还添加第三张表,则持续时间会增加。引理包含 +7300 行,引理包含 +7600 行我的问题是:1)正常吗?2)如何改进 API 以使请求更快?3)我在本地主机中,如果我在真实服务器上会有所不同吗?可以更快吗?
查看完整描述

1 回答

?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

你提出了太多的数据库请求!使用来自其他表« 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)

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


如果您想将所有行合二为一,请这样做(第一个值;第二个值;第三个值;等等):


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 等)。


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


查看完整回答
反对 回复 2022-07-02
  • 1 回答
  • 0 关注
  • 167 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号