2011-01-05 23 views
0

我之前在(integer-vs-char-for-db-record-property)之前問過類似的問題,但偶然發現了一些違背了我在之前的文章中收到的所有建議。在Wordpress 3中,最流行和最成熟的開源博客腳本,發佈狀態在db - 'publish','auto-draft','inherit','pending'等存儲爲VARCHAR(20),或映射的字符串常量,或者CHAR或類似的東西。這也適用於post_type('post','attachment','revision'等)字段和其他字段。 所以要找到所有發佈的帖子,我需要運行一些類似SELECT * FROM posts WHERE post_status = 'published' AND post_type = 'post'。另外,在post_status,post_type和其他一些列上有多列索引,這肯定會加快這種搜索速度。有人可以解釋爲什麼他們這樣做而不是另一種,這種方法的優點和缺點是什麼?整數vs數據庫記錄屬性與Wordpress模式的字符

回答

1

只是因爲一些應用程序是衆所周知的並不意味着他們有一個很好的數據庫設計。這往往違反了規範化規則。也許他們獲得了更好的表現,也許他們在選擇這個時沒有考慮其他可能性,因爲他們沒有更好的瞭解。也許他們是應用程序員設計數據庫而不理解數據庫理論,或者這是一個故意的數據庫性能統計數據庫來支持它。或者,當我們決定將價值從「已發佈」改爲其他內容時,他們可能沒有想到必須更新1億條記錄的機會。也許他們只測試選擇的性能,而不是更新。也許這些價值觀經常不願意改變,因此去規範化並不是什麼大不了的事情。我們無法從這裏知道。

+2

入庫狀態和post_type爲字符串不可能「違反規範化規則」(甚至「傾向於」違反這些政策,據我可以看到)。文森特所描述的設計可能會使數據庫比需要的大得多,但這是一個不同的問題。規範化對存儲在列中的數據類型完全不知道,並且與存儲大小無關。我認爲這應該是清楚的。 – sqlvogel 2011-01-05 21:59:15

1

規範化是不是用數字替換字符串或「共享」的字符串,只是因爲它們具有相同的字母。

我不知道他們的設計,但即使它使用字符串作爲標識符,以下場景也完全標準化。

create table post_statuses(
    status varchar(20) not null 
    ,primary key(status) 
); 

insert into post_statuses values('publish'); 
insert into post_statuses values('inherit'); 
insert into post_statuses values('pending'); 

create table posts(
    post_id ... 
    status varchar(20) not null 
    ,primary key(post_id) 
    ,foreign key(status) references post_statuses(status) 
); 

使用了代理鍵自然鍵的主要好處是可以減少的聯接所需要的數量,也是情形產生的查詢的整個類可以從指數纔會回答。如果我們需要改變這些值,主要的缺點就是存儲量增加以及存在地獄的可能性。

0

我猜WP開發者只是迴避了他們認爲過早的優化,而選擇了更好的可讀性。

"SELECT * FROM posts WHERE post_status = 'published' AND post_type = 'post'" 

有點有點容易比

"SELECT * FROM posts WHERE post_status = ".WP_POST_STATUS_PUBLISHED." 
    AND post_type = ".WP_POST_TYPE_POST."" 

當一個新的WP開發者運行select * from ...查詢,數據庫表中列出「發佈」,而不是3或5,這是更容易閱讀了解和調試。

從視圖的磁盤存儲空間來看,這兩種方法是相當好的,我認爲 - 有些更post_status字節應該沒多大關係相比,博客文章的文本和所有其他列。一個整數是8個字節(除非它是一個tinyint),'已發佈'可能是10個字節,所以無關緊要?