一些雜項

數據冗餘

在product表中我們的main_img_url和img_id是指向相同的url,爲什麼要數據冗餘?這裏是出於性能的考慮,當數據量如果比較多,嵌套循環(theme-product-image)也多的情況下,查詢起來性能會有所影響,product表如果要去image表中查詢圖片url,在有足夠多的product時,查詢性能就會有所影響,而做了數據冗餘就可以減少去image表中查詢url,從而提高一部分性能,減少數據庫壓力,主要要合理利用,不能濫用,根據具體的情況來決定,先搞清楚業務,數據庫優化是比較重要的

爲什麼不要濫用數據庫冗餘呢?

對維護數據庫的完整性和一致性是比較困難的,例如在增刪改查中多出一系列的操作,加大了編碼的壓力。

REST的合理利用

Rest是基於資源的,不管當前業務需要與否,都統一返回模型所有的關係數據,常規一般都是客戶端需要什麼就返回什麼,在我們返回所有的關係數據中,我們應該適當地隱藏一些不需要用到的屬性。總結來說,要根據具體業務來具體返回特定的關係數據,這是內部API需要考慮的,服務端是清晰知道客戶端需要什麼數據的,從而控制返回的數據,可以編寫多個接口來防止業務的變更。

編程思維

小功能小方法都是工具,具體就是要根據業務來然後查找是否有相應的工具能夠支持我們的業務編寫,由目的來指導我們的功能實現。上面的形式就體現了面向對象的強大,如果是數組的形式處理起來會比較複雜,因爲沒有一些內置的處理方法。而數據集對象就提供了很多的方法來處理我們的業務。一組product模型對象可以理解爲就是數據集對象,最好就是用對象自帶的方法來處理,不用公共的或類外面的方法去處理能夠提高類的內聚性

接口粒度與接口分層

我們首頁獲取使用了getbanner接口和getSimpleList接口以及getRecent接口,客戶端和向服務器發起了三次請求,我們能不能把是三個接口放在一個接口上,讓客戶端只請求一次服務器呢?答案是可以的,這種方式是我們傳統網站的一種思維方式,這是站在當前業務考慮的問題,並沒有站在數據的角度去考慮問題,這會導致什麼問題呢?任意的一個小地方如果發生小小的業務變化,就會導致整個接口的劇烈變化。如果是從數據的角度來考慮這個問題,每個Api保持一定的獨立性,API的複用就較爲容易,如果是按照功能來考慮的話,則API綁定起來的通用性會很差。
那發三次請求有什麼優點缺點?
缺點:過多的http鏈接對服務器有一定壓力,減少http的連接數是可以提升服務器性能的。
優點:API接口的複用性比較高。
接口粒度與接口分層。
面對以上的問題解決方案是如何的呢?
本身的API視作一個基礎數據API,如果某個業務所需要的接口調用數量確實很多的情況下,則應該在基礎數據API上再建立一個業務層,然後在業務層的內部再去調用基礎數據層的API相關的接口,再封裝成一個統一的適合當前業務訪問的接口一次性返回,這就是分層的具體應用,大型項目裏的基礎數據層,服務層就類似我們說的接口分層,是要考慮接口粒度的

一對多或多對多新增

我們可以拆分爲兩小步,先在主模型上新增數據,然後在關聯模型上新增,如果是多對多的關係,則可以在中間表上新增數據,可以擴展多個字段

時間戳自動寫入

autoWriteTimestamp屬性支持設置爲時間日期類名,如果設置爲false,表示關閉自動寫入

//設置時間戳自動寫入
protected $autoWriteTimestamp = true;

//自定義設置時間字段
protected $createTime = 'create_at';
protected $updateTime = 'update_at';

//關閉時間戳字段寫入
protected $createTime = false;
protected $updateTime = false;
業務中使用事物
// 啓動事務
Db::startTrans();
try{
    Db::table('think_user')->find(1);
    Db::table('think_user')->delete(1);
    // 提交事務
    Db::commit();    
} catch (\Exception $e) {
    // 回滾事務
    Db::rollback();
}
數據校驗小技巧

舉例:在service下的Pay類中調用檢測order類中的檢測庫存量方法,還需要檢驗訂單號的安全性,第一種將最有可能發生的寫在前面,一旦被檢測出來後續操作會中止,可以節約服務器性能;第二種將最消耗服務器性能的檢測儘量放在後面

使用擴展類庫

ThinkPHP5建議所有的擴展類庫都使用命名空間定義,如果你的類庫沒有使用命名空間,則不支持自動加載,必須使用Loader::import方法先導入文件後才能使用,強烈建議使用Composer安裝和更新擴展類庫

Loader::import('first.second.Foo');
$foo = new \Foo();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章