91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

數據庫設計中boolean類型怎么處理

發布時間:2022-01-19 16:15:35 來源:億速云 閱讀:1400 作者:iii 欄目:開發技術

這篇文章主要介紹“數據庫設計中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類型怎么處理”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

柳林县| 浏阳市| 永泰县| 青川县| 崇文区| 肥西县| 汾阳市| 阿克| 施秉县| 衡东县| 西吉县| 台南县| 彭州市| 杭锦旗| 揭西县| 甘谷县| 扎兰屯市| 南华县| 容城县| 黑龙江省| 桑植县| 喀什市| 芮城县| 扎兰屯市| 靖江市| 广昌县| 山丹县| 固始县| 分宜县| 南雄市| 霍州市| 望都县| 景洪市| 资溪县| 邢台市| 仁寿县| 伊川县| 四平市| 衡水市| 梅州市| 寿阳县|