本文為 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
GraphQL Design: 使用 DataLoader 提升效能 !
心得
對這個問題還不是那麼熟悉,但是目前似乎有初步的理解了,放著之後慢慢研究。