反向代理(Reverse proxy)、ORM 及 N+1 problem 介紹


Posted by Christy on 2022-02-17

本文為 Lidemy W18 作業三的簡答題。

1. 反向代理(Reverse proxy)

反向代理的實作原理就是 client 端發送請求到伺服器時,伺服器再轉發到其他伺服器,client 不知道 server 的真實身份,把 server 藏起來。

使用原因:因為只有一個伺服器可以佔用 80 port,但通常一台伺服器會有多個服務,那其他服務的網址就會變成 http://www.service.com:3306,就會很奇怪。

因此在 80 port 上放反向代理伺服器,就可以根據客戶端的參數,藉由參數設定的 sub domain,把請求轉到不同的地方去。

另一個好處是,別人看不出來你在內部使用哪一個 port。

2. ORM

ORM 全稱為 Object Relational Mapping,是一種把資料庫轉換成物件並且關聯對映的方法,感覺像是鏡像並且複製一份,人動鏡子裡面的人也動這樣。

優點在於可以防止 SQL injection,未來資料庫轉移時,比較不需要改寫程式碼。

3. N + 1 problem

什麼是 N + 1 problem?

背景:

假設有 User 及 review 兩份表格,使用 user_id 進行關聯,有一個查詢是「找出 20 歲以上使用者的所有評論」

執行狀況:

在查詢時,第一次先找出「所有 20 歲以上的使用者」,假設有五筆資料。

接著在這五筆資料裡面,再把評論撈出來,因此是從第一筆資料查詢到第五筆。

第一次查詢主要的 User 表格,以查詢到的結果,再查詢有關聯的副表格。

這篇文章 什么是 N+1 问题,以及如何解决 說得很好,其實應該要稱作「1 + N」問題。

也就是說,第一次查詢出來是 N 個紀錄,實際執行時需要查詢的次數是 N + 1 次(就執行順序來說,1 + N 次比較合理),這就叫做 N + 1 問題。

為什麼會有這個問題?

查到的資料大部分是說,可能是新手會犯的錯誤,其實用一個 SQL 的 join 就可以了,但是在 ORM 裡面,很有可能會寫出這樣的程式碼。

解決辦法

ORM 相對應的方案:預加載 preload with

參考資料:

Understanding and fixing N+1 query

[Day 16] 關聯資料表加載,解決 N+1 Query

什么是 N+1 问题,以及如何解决

GraphQL Design: 使用 DataLoader 提升效能 !

[科普文]什么是ORM中的N+1

ORM — N+1 Problem

心得

對這個問題還不是那麼熟悉,但是目前似乎有初步的理解了,放著之後慢慢研究。










Related Posts

如何在 Windows 安裝 OpenPose 跟使用 Python API 來偵測人體姿態

如何在 Windows 安裝 OpenPose 跟使用 Python API 來偵測人體姿態

Object get keys and values method

Object get keys and values method

Day00 - CERN ROOT 教學 | 動機、這是什麼

Day00 - CERN ROOT 教學 | 動機、這是什麼


Comments