設計標準
什麼樣的設計是好的設計,設計又有什麼樣的目的?
各類環境下的各類人都會表達一下本身的見解,就目前來看,彷佛沒有一種統一的共識,也可能沒有人作過總結。目前,從書本上,咱們可能學習過第一範式、第二範式等,這種範式體適用場景有限.有些設計書講的很是寬泛,有的時候並不適合咱們。那麼如何來作選擇?
開始,咱們來明確設計的標準,根據設計的標準,那麼纔好去評價一個設計的好壞。
設計首先是知足需求的。咱們作東西都是有必定目的的,哪怕是以學習的目的,可能有的時候不會把目的放得很重,好比:出於好奇心,那麼知足好奇心也是本身的目的。這裏,咱們不講寬泛的目的,咱們講實現一個產品,作一個項目,完成一個功能所須要達到的標準。那麼,在這裏,需求就是咱們的目的,咱們的目的就是知足需求。這是咱們這裏最基礎最基本的標準,也是必需要知足的條件;
設計最好是可擴展的。這裏咱們分性能擴展和功能擴展。性能擴展,網站的訪問量存在很大的不肯定性,在設計的初期,流量的預估是一個很重要的環節。固然,開始環節,咱們的流量都是從無到小,從小到大。咱們作一個月的準備,三個月的儲備。假設就當前狀況,你的設計是針對10wpv來作的設計,當你完成了項目的時候,發現網站很火,pv增加到了20w,那麼對於這種增加,你的設計是否能夠容易進行擴展。若是設計的不夠好,那麼極可能要從新設計。另外,功能方面,你的設計是否支持功能的增減。也許有人說,給我10w的需求,我就照着100w的設計。這種設計咱們稱之爲「過分設計」,表示遠遠超出了能知足需求的設計。這種設計會形成資源浪費。所以,作這方面須要有必定的經驗,須要對不一樣設計作出嘗試、思考。
設計是方便維護的。若是有一天,你的網站訪問不了了,你怎麼很快地知道是哪裏出了問題?多是nginx沒有啓動,多是數據庫出現異常,也有可能PHP內的某個邏輯出了問題。線上故障拖一秒就可能損失一位用戶,丟失的數據怎麼處理?設計得很差,你可能一個一個查,甚至從頭開始讀源碼,那麼這樣的設計是不是可維護的。方便維護的設計可減小故障形成的損失。所以,是否好的設計,也是個人一種評價。
以上三點,是我我的認爲設計好壞的評價。固然,敏捷軟件開發裏也提到一些關於設計的話題,設計原則也是今後而來。有興趣的同窗也能夠看看。
爲何選擇MYSQL
你可能會發現有各類各樣的存儲系統,文件存儲,數據庫存儲,內存存儲,還有第三方存儲。如何作取捨?在這裏,咱們着重討論數據庫存儲(以MYSQL爲例)適用的場景。
存儲數據有需求,那麼若是你的存儲有以下考慮:
mysql
可持久化存儲nginx
支持數據篩選sql
支持數據增刪查改,並能夠保證一致性數據庫
支持必定容量和訪問優化性能
良好的錯誤處理學習
穩定性良好
優化
上面說的不清晰,咱們舉個例子吧。
存儲一次性數據,一次存儲,一生不變,咱們選擇文件存儲。如:上傳文件、靜態化的數據等;
存儲一篇博客,之後可能會改,會動態增長、刪除,那麼選擇數據庫;
對數據及時性要求很是高(1s內的時延)、計算性能要求較高,數據量不大,選擇內存;
若是存儲的東西不考慮類型,不考慮實現方案,又願意給錢,那麼就使用第三方存儲吧。
以上僅是我的的一些經驗,給你們作一個參考。
使用MYSQL
這裏,咱們針對的是有必定經驗的PHPer,所以,咱們不會對MYSQL作很是細緻的講解。
不過,咱們會針對咱們要使用的內容,對涉及的知識,作介紹。
這裏,咱們着重描述幾個常見的操做以及注意的地方。
建表(create)
通常狀況下,這種操做通常會在設計初期完成,並且是一次性的工做,須要注意的地方很少,就一點:作好備份,方便後續更新;
設計時,對某些本身插入時不想寫入的字段,給出默認值;另外,須要注意:字符集、索引、主鍵、字段類型。
修改表(alter)
通常狀況下,這種不會帶到線上來作。修改的時候,須要注意一下新增字段的位置
刪除表(drop)
通常狀況下,這種不會帶到線上來作。可是須要注意:這個操做不可逆,一單操做,意味着數據都丟了。
插入數據(insert/replace ignore)
插入數據時,儘可能寫全;配合建立表時的默認值使用,固然,也能夠不考慮,在這裏給出;
這裏須要注意:索引的衝突;
更新數據(update)
更新數據儘可能使用where來篩選;
篩選的條件使用索引;
刪除數據(delete)
儘可能使用軟刪,即便用標記字段來表示一個字段被刪除了,同時,不破壞表的存儲結構;
查詢數據(select)
查詢字段能夠不使用就不使用;一個是mysql本身的計算,一個是帶寬,一個是PHP內存佔用;
查詢條件使用limit限制數據;
where條件,根據區分度選擇使用索引;
order by儘可能使用主鍵,可以使用索引;
以上,特殊狀況特殊項目除外
討論
網站
哪些操做須要特別當心?任何能夠改變數據內容的操做,都須要當心;當心的意思是說,在你打算作這個修改以前,先考慮充分。spa
老師能夠舉例講一個實際項目中,如何設計數據庫和表嗎?
會的,咱們會以一個留言板的項目來設計數據庫和表。設計
老師會把數據庫講到什麼層次?
會講到我目前的水平:能夠完成大部分的數據庫的設計,給出各類功能需求的解決方案。
下面這兩個查詢,哪一個效率高?
$sql_1 = "SELECT * FROM table_a WHERE account='abcdef' AND reg_time>'2013-01-01'";
$sql_2 = "SELECT * FROM table_a WHERE reg_time>'2013-01-01' AND account='abcdef'";
同樣高。以前我一直覺得左邊的會在右邊的以前作區分度,後來跟一位同窗研究時發現,這個效率是同樣的。
explain怎麼使用?
後面咱們專門準備一節來說吧。
多庫操做,讀配置文件?是的,通常咱們是這麼作的。