[英]Mysql storing lots of bit sized settings
我有約38列的表格。
ID
, name
和其他36個是用戶的位大小設置。
其他36列分為6個“設置”,例如Setting1_on
, Setting1_colored
等。
這是最好的方法嗎?
謝謝。
如果必須在一個表中並且它們都是切換類型設置,例如yes / no,true / false等,請使用TINYINT節省空間。
我建議創建一個單獨的表“設置”,其中包含36條記錄,每個選項一個。 然后使用值列創建到用戶表的鏈接表以記錄用戶設置。 這將為用戶設置創建一個多對多鏈接。 這也使添加新設置變得容易-只需向“設置”表中添加新行。 這是一個示例架構。 我使用varchar作為設置的值,以允許以后的設置(可能不是位),但是如果大小有問題,請隨時使用TINYINT。 此解決方案將不會使用一個表那么多的空間,而會產生大量的稀疏填充的列。
CREATE TABLE `user` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(64) DEFAULT NULL,
`address` varchar(64) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `setting` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(64) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `setting_user` (
`user_id` int(11) NOT NULL DEFAULT '0',
`setting_id` int(11) unsigned NOT NULL,
`value` varchar(32) DEFAULT NULL,
PRIMARY KEY (`user_id`,`setting_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
一切都取決於您要如何訪問它們。 如果要(或必須)只是選擇其中之一,則使用@Ray解決方案。 如果可以對其進行功能分組(實際上,不是所有以F開頭的分組都假裝分組),即。 您將始終需要多個函數才能使用它們,並且將它們作為單獨的標志進行讀取和編寫沒有任何意義,然后也許將它們存儲為int並在它們上使用邏輯運算符可能會變得更好。
這樣說,除非您在會話期間對數據庫進行大量讀取和寫入,否則將它們捆綁為int只會給您帶來很少的性能,否則,如果所有選項都必須存在,則會節省數據庫空間。 如果不存在= false,則可能是一個折騰。
所以所有事情都是不平等的,我會和雷先生一起去。
MySQL具有SET
類型,在這里可能有用。 一切都可以放入一個SET中,但是六個SET可能更有意義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.