我之前在(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模式的字符
0
A
回答
1
只是因爲一些應用程序是衆所周知的並不意味着他們有一個很好的數據庫設計。這往往違反了規範化規則。也許他們獲得了更好的表現,也許他們在選擇這個時沒有考慮其他可能性,因爲他們沒有更好的瞭解。也許他們是應用程序員設計數據庫而不理解數據庫理論,或者這是一個故意的數據庫性能統計數據庫來支持它。或者,當我們決定將價值從「已發佈」改爲其他內容時,他們可能沒有想到必須更新1億條記錄的機會。也許他們只測試選擇的性能,而不是更新。也許這些價值觀經常不願意改變,因此去規範化並不是什麼大不了的事情。我們無法從這裏知道。
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個字節,所以無關緊要?
相關問題
- 1. 產品屬性的數據庫模式
- 2. 將字符數組與數據庫記錄進行比較並讀取記錄
- 3. 用於搜索整個數據庫記錄而非特定字段的模式
- 4. 用於分組記錄的數據庫模式模式
- 5. 數據記錄模式更改數據
- 6. 確保開源數據庫中的記錄值完整性
- 7. 網格json數據無記錄屬性
- 8. 標記:數據庫VS XML
- 9. 用數據庫中的嵌套屬性創建記錄
- 10. 數據庫的記錄存儲與revisioning
- 11. MongoModel gem vs無模式數據庫
- 12. 格式化Access數據庫的記錄
- 13. 建模是數據庫中的屬性
- 14. 數據庫模式vs數據庫表空間?
- 15. 整數字符串從數據庫
- 16. 整數與數據庫中的字符串
- 17. 如何動態更改給定數據記錄的字段屬性的屬性?
- 18. 數據庫與JSON Vs嵌入式數據庫
- 19. 數據庫vs XML用於已發佈的記錄目錄
- 20. 數據與字符串數組中jQuery Mobile的屬性
- 21. 數據庫vs javascript字符串認證
- 22. 數據庫:字符串Json vs新列
- 23. 遍歷數據庫記錄創建屬性哈希
- 24. jqGrid - 將數據庫記錄嵌套屬性設置爲行ID
- 25. 無法保存記錄屬性數據庫
- 26. 如何調用數據庫記錄以及數據庫記錄
- 27. 將pandas DataFrame重整爲堆疊/記錄/數據庫/長格式
- 28. 數據庫表vs vs/yml屬性值很少變化
- 29. MVC數據庫模型動態屬性
- 30. Django模型非數據庫屬性
入庫狀態和post_type爲字符串不可能「違反規範化規則」(甚至「傾向於」違反這些政策,據我可以看到)。文森特所描述的設計可能會使數據庫比需要的大得多,但這是一個不同的問題。規範化對存儲在列中的數據類型完全不知道,並且與存儲大小無關。我認爲這應該是清楚的。 – sqlvogel 2011-01-05 21:59:15