2015-11-06 30 views
0

我正在記錄來自用戶的表單數據,並將該數據存儲在MySQL數據庫中。許多問題是是/否問題。經過一些研究,我決定與TINYINT一起爲數據類型。現在,如果其中一個問題需要一個文本輸入,如果答案是「是」,但如果答案是「否」,那麼不會輸入文本,我將需要一個VARCHAR。MySQL使用NULL/NOT NULL VARCHAR而不是TINYINT

CREATE TABLE `UserResponse` (
    `question1` TINYINT NOT NULL,  # 0="No", 1="Yes" 
    `question1Details` VARCHAR(45) NULL 
) 

所以我的問題是......由於VARCHAR永遠是NULL當TINYINT爲0,那就更有意義,只是有VARCHAR,忘了TINYINT爲「是」 /「否」 ?

CREATE TABLE `UserResponse` (
    `question1` VARCHAR(45) NULL  # NULL="No", !NULL="Yes" + details 
) 

我的想法:用兩列,如果有(可能意味着40列,而不是20,例如)這類問題的許多情況下可能擾亂數據庫。至於空間......無論是否需要VARCHAR,其值都不受我們是否使用TINYINT的影響。所以,如果我們刪除了TINYINT,它將爲每行每個實例節省1個字節。我所看到的唯一不利之處是讀取/修改表的前端代碼會稍微複雜一點,因爲必須解釋NULL/NOT NULL才能從同一列中獲取2個問題的數據,而不是讀取每個問題關係簡單1列。

無論哪種方式可以完成,並且任何一種方式都可以正常工作。但是,最佳做法是什麼?如果您在處理由其他人設計的數據庫時遇到任何一種方法,那麼他們使用該方法而不是另一種方法會對您有影響嗎?

回答

0

這真的很可選。我會去只有一個列和測試NULL s。否則,你必須考慮如何保持兩個值同步。

不幸的是,MySQL既不支持約束也不支持計算列,所以保持一致性比需要的更困難。

另一方面,你應該有一個表,每個用戶和每個問題一行。這比以列的形式添加問題要靈活得多。事實上,調查設計本身就是一門科學,但是您必須考慮隨着時間的推移添加,刪除和修改問題。