您好,登錄后才能下訂單哦!
這篇文章主要介紹“數據庫設計中boolean類型怎么處理”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“數據庫設計中boolean類型怎么處理”文章能幫助大家解決問題。
數據庫的boolean值是一個令人頭疼的問題,涉及到多方面的問題。
數據庫中的boolean字段,以什么方式命名?通常會要求boolean值以is開頭,比如阿里的數據庫設計規范強制要求boolean型以is_開頭,比如is_deleted。這確實可以很直觀的讓人知道某個字段的類型,我也很喜歡這樣。
但是命名不僅僅是在數據庫里面,JavaBean里面如何命名呢?為了統一性(特別是使用工具從數據庫生成Java類),JavaBean里的屬性名應該和數據庫字段名一致,當然是isDeleted。
那么問題來了,JavaBean的get、set方法如何寫呢?如果用開發工具(如IntelliJ IDEA)生成,會是這樣:
public class User { private Boolean isDisabled; public Boolean getDisabled() { return isDisabled; } public void setDisabled(Boolean disabled) { isDisabled = disabled; } }
有些生成工具產生如下代碼也不要奇怪:
public class User { private Boolean isDisabled; public Boolean getIsDisabled() { return this.isDisabled; } public void setIsDisabled(Boolean isDisabled) { this.isDisabled = isDisabled; } }
如果使用原生類型boolean而非對象類型Boolean,則代碼如下:
public class User { private boolean isDisabled; public boolean isDisabled() { return this.isDisabled; } public void setDisabled(boolean disabled) { this.isDisabled = disabled; } }
再用jackson生成JSON,會是{disabled:false}或{isDisabled:false}。
于是數據庫isDisabled,JavagetDisabled() isDisabled() getIsDisabled(),JSONdisabled isDisabled。是不是有點凌亂?
太混亂了,所以有很多開發規范里禁止JavaBean屬性使用is開頭。
數據庫說要is開頭,JavaBean說不要is開頭,到底要不要?也許可以讓數據庫的字段用is開頭,在JavaBean里則去掉is。這是一個辦法,但從數據庫自動生成JavaBean的時候,就要手動改了。而且JavaBean、JSON里都沒有is開頭,在數據庫里又突然又有is開頭,也是一種混亂。
最后的結論是,都不要is開頭,且boolean型不能為空。JavaBean用原生類型boolean而不是Boolean。這樣數據庫disabled,JavaisDisabled(),JSONdisabled,這樣就簡單明了多了。
另:可為空的Boolean可以考慮用char(1),如性別(m:男,f:女,n:保密)。
雖然boolean型是SQL標準的數據類型,但很多數據庫都沒有提供boolean類型,理由是這個數據類型太容易代替了,沒有必要專門用一個數據類型。比如用char(1)或者int。
可代替是可代替,那實際使用中,怎么代替才是最佳實踐呢?
Hibernate是這樣處理的:
使用數值型(如int或者tinyint),則0表示false,1表示true。
使用字符型(如char(1)),則N/n表示false, Y/y表示true,或者F/f表示false, T/t表示true。
很顯然使用數值型比較直觀,畢竟和c語言的規則一致,計算機一貫的傳統。
字符型則稍顯混亂,當然字符型也可以用0和1,特別是在oracle中用char(1)比用number(1)更節省空間。char(1)占一個字節,number(1)占兩個字節。在其它沒有1字節的數值型數據庫中,也是這樣(如DB2)。
用char(1)還一個問題,就是數據庫自動生成JavaBean時,無法判斷是字符型還是boolean型。特別時字段不以is開頭,就更無法自動判斷了,這對自動生成代碼很不友好。眾所周知,自動生成代碼在開發里面有著很高地位,沒有人愿意把時間花在重復的、沒有意義的事情上面。
MySQL中,有boolean類型,但這個類型是tinyint(1)的同義詞,就是說boolean也是用數值存儲的。
阿里的數據庫設計規范也是要求使用tinyint(1)存儲boolean類型。
數據庫管理工具liquibase的規則是有boolean類型的直接用,沒有的用bit或者數值代替:
MySQLDatabase: BIT(1) SQLiteDatabase: BOOLEAN H2Database: BOOLEAN PostgresDatabase: BOOLEAN UnsupportedDatabase: BOOLEAN DB2Database: SMALLINT MSSQLDatabase: [bit] OracleDatabase: NUMBER(1) HsqlDatabase: BOOLEAN FirebirdDatabase: SMALLINT DerbyDatabase: SMALLINT InformixDatabase: BOOLEAN SybaseDatabase: BIT SybaseASADatabase: BIT
liquibase在MySQL中使用BIT(1),沒有直接用MySQL的boolean類型,這個有點奇怪,可能liquibase認為MySQL的boolean是假的(實際是tinyint(1)),還不如用BIT(1)。咱就不和數據庫較這個勁了,直接用MySQL的boolean,數據庫說啥就是啥,它總比我們了解它自己吧,總不能讓我們吃什么大虧。
如此看來,并不好逆流而動用char(1)作為boolean。至少看在代碼自動生成的份上,開發環境上用數值做boolean(一般是MySQL,直接用bool類型,數據庫自動轉為tinyint(1))。生成其它數據庫腳本時,如果為了方便(char(1)所有的數據庫都有)或者節省存儲空間,將boolean轉成char(1)也許不是什么大問題(MyBatis會映射成BIT類型,不知能否操作char(1))。
關于“數據庫設計中boolean類型怎么處理”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。