溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

數(shù)據(jù)庫設(shè)計中boolean類型怎么處理

發(fā)布時間:2022-01-19 16:15:35 來源:億速云 閱讀:1397 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“數(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:保密)。

數(shù)據(jù)庫類型

雖然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è)資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節(jié)

免責聲明:本站發(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)容。

AI