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