首先 Yii 應用程序廣泛使用了 CActiveRecord, 設計的考慮主要圍繞優化使用而不是組成復雜的 SQL 語句. 實際上大多的設計是使用友好的 SQL 模式來解決實踐中的問題.
最常用的方式是創建易於被人閱讀和理解的代碼,例如使用命名來傳達意思,但是這很難做到.
特別當你在論壇或 '#yii' 頻道尋求幫助時,使用奇怪的名字意味著你會有一堆麻煩:解釋代碼是干什麼的。你的問題有時就不會得到有效解決.
一堆一致性問題.
然而這些只是准測而不是規則,你的代碼不遵循這些准則也照樣會工作,但是如果你遵循這些准則你的代碼將更加簡單.
我們認為 SQL 表 包含很多記錄,一個模型(model) 只是其中的一個,在任何地方使用 $model = new Comments()
來表示再次定義關系時感覺非常奇怪.
命名您的表名為 comment
而不是 comments
,invoice
而不是 invoices
等等。對於的模型(model)類名也是一樣(Comment
,Invoice
等等).
如果你不可以改變數據庫的模式,但至少在適當的情況下你可以改變 Yii 模型類(model class)的名稱,在這種不匹配的情況下你應該在代碼中添加一個額外的注釋 //COMMENT
來提醒用戶.
下面的做法是在傳統 SQL 設計模式上非常常見的,但是它在於 ActiveRecord 結合時時冗長復雜的。在 category
表中:
-- 不可取 -- 可取 create table category ( create table category( category_id INTEGER ..., id INTEGER ..., category_name VARCHAR ..., name VARCHAR ..., category_value INTEGER value INTEGER ); ); // 不友好的 // 友好的 $model->category_id $model->id $model->category_name $model->name $model->category_value $model->value
雖然使用這種 long
方式生稱的 SQL 語句容易理解一些,但是在 ActiveRecord 中使用就不太方便了.
Yii 支持表前綴,表前綴被用在 所有 應用放到共享的主機並且共享一個數據庫的環境中. 你的博客表前綴為 blog_
,計時應用的表前綴為 time_
等等. 它們存在於同一個數據庫中而互相不起沖突.
前綴 tbl_
在很多教程和例子中經常看到。
但是類不需要包含這些前綴,因為沒有必要避免沖突:你的博客應用和你的計時應用時兩個不同的應用.
class TblComment extends CActiveRecord { // 不可取 class Comment extends CActiveRecord { // 可取
在代碼中看到無處不見的前綴使人們非常反感.
id
大多數表都有一個唯一主機,命名主鍵為 id
(而不是 commentid
、postid
) 會使你的工作更加順手.
雖然無論你是否訪問數據庫 Yii 都可以通過讀取數據結構來得到它的主鍵,但是系統的其他部分可能不會這樣做,並且它們依賴的主鍵為 id
.
例子:CArrayDataProvider 默認的主鍵為 id
, 雖然你可以重寫它的屬性 'keyField', 但是把這放到第一位是很不方便的.
顯而易見,當使用復合主鍵時這將不能工作,但是這畢竟是少數.
一個經典的設計錯誤是創建的表的主鍵有實際意義. 在下面的列子中 用戶(user)表使用的用戶名(name)作為主鍵:
-- 不要這麼做! CREATE TABLE user ( name VARCHAR(16) PRIMARY KEY, -- bad idea email VARCHAR... ... )
這樣做引發了兩個問題:This presents two difficulties: