阿里規範不建議多表Join,可這SQL要怎麼寫?

阿里開發手冊的描述,禁止多表join:html

阿里規範不建議多表Join,可這SQL要怎麼寫?

手冊上寫着【強制】,相信不少同窗項目裏面的代碼都不知足這個要求。mysql

可是關鍵問題是:不用join,這SQL究竟要怎麼寫?!sql

分解關聯查詢數據庫

即對每一個要關聯的表進行單表查詢,而後將結果在應用程序中進行關聯。下面的這個查詢:編程

SELECT * FROM tag 
JOIN tag_post ON tag_post.tag_id=tag.id 
JOIN post ON tag_post.post_id=post.id 
WHERE tag.tag = 'mysql';

能夠分解成下面這些查詢來代替:網絡

SELECT * FROM tag WHERE tag = 'mysql';
SELECT * FROM tag_post WHERE tag_id = 1234;
SELECT * FROM post WHERE post.id in (123,456,567,9098,8904);

可是該方案也會有很明顯的問題,就是in後面的參數可能會過多,可見這個方案的通用性其實很是有限。併發

打破範式標準高併發

建議建表的時候,就把這些列放在一個表裏,好比一開始有student(id, name),class(id, description),student_class(student_id, class_id)三張表,這樣是符合數據庫範式的(第一範式,第二範式,第三範式,BC範式等),沒有任何冗餘,可是立刻就不符合「編程規範「了,那咱們能夠用一張大表代替它,student_class_full(student_id, class_id, name, description),這樣name和description可能要被存儲多份,可是因爲不須要join了,查詢的性能就能夠提升不少了。post

任何的規範都是在特定狀況下的某種妥協,脫離了這個環境,就不必定成立了。性能

須要說明的是,這種脫離範式的設計,是互聯網業務在設計高並發表時慣用的作法!

具體問題具體分析

最後,建議具體問題具體分析,即便多表Join在阿里規範是強制不容許的,但好比在管理後臺這類併發量很低的業務場景下,依然是能夠進行多表Join操做的!

多表Join並不必定是很Low的作法,在錯誤場景下多表Join纔是很Low的作法!

本文來自 木莊網絡博客> 阿里規範不建議多表Join,可這SQL要怎麼寫啊?
相關文章
相關標籤/搜索