簡體   English   中英

標記列,Varchar還是INT?

[英]Flag columns, Varchar or INT?

我經常在數據庫中使用(稱為)“標志”列,例如:

Column 'Type':
0 = CREATOR
1 = OPERATIVE
2 = APPROVER 

但這是正確的方法嗎? 我之所以只問是因為,當我不記得零,一,二或三的含義時,稍后再回到它可能會造成混淆。 簡單地將它們標記為CREATOR等不是更好嗎?

對此有什么普遍接受的做法?

標志通常是布爾值truefalse01表示的bit (MySQL 5.0.3+)或tinyint 如果您有兩個以上的可能值,則可以將這些值存儲在MySQL的ENUM中,否則,這些可能的值應存儲在自己的表中,並使用外鍵關系(規范化)進行引用。

在索引方面,INTEGERS比STRING更受青睞。

但是你可以有另一個表,僅僅保存了rolesINT role_id primary keyUNIQUE VARCHAR role column 然后,在user_roles ,將user_idrole_id作為指向roles`.`role_idFOREIGN KEY

  • 這樣的角色保持INT ,但可以JOINEDroles表來得到它的名字。
  • 而且,當您需要使用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的字符串有效。

Varchar Mysql參考

在這種情況下,您可以使用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是在這種情況下使用的最差類型,正如其他人所提到的那樣您可以將ENUMINT或關系表與角色一起考慮。

差異是:

使用ENUM插入記錄時可以使用文字和數字作為值。 再次選擇時,可以在WHERE使用文字和數字,但是如果要獲取數字,則返回的值將是一個字符串。必須在字段列表中選擇columnsname+0

使用INT您只能使用數字。

所以聽起來ENUM應該更好,如果你創建一些靜態常量來保存你的代碼中的數值,一切都會變得更容易。

現在關系比ENUM好嗎?

如果您需要靈活性並希望從PA關系表中添加新角色,那么您應該考慮唯一的解決方案。

如果您的角色是不變的並且永遠不會改變ENUM則無需涉及JOIN。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM