中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

數據庫設計中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

青岛市| 海城市| 花莲市| 酒泉市| 双流县| 浦县| 徐州市| 丹巴县| 肥乡县| 都江堰市| 习水县| 大埔县| 闸北区| 新源县| 盘山县| 略阳县| 晴隆县| 平度市| 灵台县| 东阿县| 偏关县| 从江县| 丰台区| 高州市| 探索| 湛江市| 府谷县| 礼泉县| 肃宁县| 辽阳市| 辽宁省| 芜湖县| 闸北区| 仙桃市| 泰顺县| 讷河市| 诸城市| 金坛市| 民丰县| 梧州市| 扎赉特旗|