[英]Flag columns, Varchar or INT?
我經常在數據庫中使用(稱為)“標志”列,例如:
Column 'Type':
0 = CREATOR
1 = OPERATIVE
2 = APPROVER
但這是正確的方法嗎? 我之所以只問是因為,當我不記得零,一,二或三的含義時,稍后再回到它可能會造成混淆。 簡單地將它們標記為CREATOR
等不是更好嗎?
對此有什么普遍接受的做法?
標志通常是布爾值true
和false
或0
和1
表示的bit
(MySQL 5.0.3+)或tinyint
。 如果您有兩個以上的可能值,則可以將這些值存儲在MySQL的ENUM
中,否則,這些可能的值應存儲在自己的表中,並使用外鍵關系(規范化)進行引用。
在索引方面,INTEGERS比STRING更受青睞。
但是你可以有另一個表,僅僅保存了roles
與INT role_id primary key
和UNIQUE VARCHAR role column
。 然后,在user_roles
,將user_id
和role_id
作為指向roles`.`role_id
的FOREIGN KEY
。
INT
,但可以JOINED
的roles
表來得到它的名字。 role
文字時,可以從roles
表中查詢role_id
。 這是正常化。
PS : 但根據您的用戶群,它可能有點矯枉過正。 使用indexed VARCHAR role columns
可以更輕松地逃脫。
您問題的答案可能是“枚舉類型”, 在此處進行了描述。 這些允許您將字符串與數值相關聯作為MySQL中的類型 - 這是“真實”編程語言中常見的一種實踐。
但是,通常,您不希望這樣做,因為您特別需要對象的引用表。 通常,名稱是關系術語中的“實體”。 這建議您有一張桌子:
create table OperatorType (
OperatorTypeId int auto_increment primary key,
Name varchar(255)
)
在這種情況下,所有引用都將是表中的id,它將是一個整數。
不建議使用沒有枚舉類型或引用表的id。 大概name
的目的是為了使人可讀。 您不希望不同的查詢(和查詢編寫者)為運算符類型創建自己的名稱。 而是,使用內置的數據庫機制來正確處理這種情況。
最好使用int
/ tinyint
。 並始終使用comments
,這將有助於您記住所有值是什么。
數值更好地進行短路和比較。
枚舉可以是一種選擇。 但是枚舉值的常見問題是,如果您的標志在增加,則很難管理。
不要使用VARCHAR。 VARCHAR僅對大於3的字符串有效。
在這種情況下,您可以使用CHAR(1)並使用C,O和A的值作為tickler。
刪除代碼記憶的另一種方法是定義庫函數,告訴你它是什么,例如:
function isCreator($value) {
if($value === 0) return true;
}
好問題。
我總是使用tinyint。 它比varchar占用更少的空間,並且速度和索引更好。 我知道很多人使用枚舉,雖然我喜歡這個想法,但我更喜歡tinyint的靈活性。 現場評論也是一個很好的工具,對以后的工作很有幫助。
除了我知道我存儲二進制是/否值的情況我總是使用高於零的值。 從長遠來看,這可以節省很多混亂,因為PHP評估零和錯誤相同(您從Web表單收集價值的一個重大問題)。
是的,您可以將int用作“類型”列的數據類型。由於您擔心以后長久會忘記0,1,2個代表,您始終可以將其描述作為表列注釋
您可以通過執行以下alter query來更改字段並為其添加注釋:
ALTER TABLE `table_name` CHANGE `Type` `Type` INT( 2 ) NOT NULL DEFAULT '0' COMMENT '0 is CREATOR, 1 is OPERATIVE,2 is APPROVER'
我希望這可以提供一些幫助。
試試這個
make your type column a enum field and set the value like '0','1','2'
並在注釋字段中寫為0 = CREATOR,1 = OPERATIVE,2 = APPROVER。當您一年后查看數據庫時,它將幫助您記住這些值。
VARCHAR
是在這種情況下使用的最差類型,正如其他人所提到的那樣您可以將ENUM
, INT
或關系表與角色一起考慮。
差異是:
使用ENUM
插入記錄時可以使用文字和數字作為值。 再次選擇時,可以在WHERE
使用文字和數字,但是如果要獲取數字,則返回的值將是一個字符串。必須在字段列表中選擇columnsname+0
。
使用INT
您只能使用數字。
所以聽起來ENUM
應該更好,如果你創建一些靜態常量來保存你的代碼中的數值,一切都會變得更容易。
現在關系比ENUM
好嗎?
如果您需要靈活性並希望從PA關系表中添加新角色,那么您應該考慮唯一的解決方案。
如果您的角色是不變的並且永遠不會改變ENUM
則無需涉及JOIN。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.