MySQL使用NULL / NOT NULL VARCHAR而不是TINYINT

时间:2015-11-06 04:02:59

标签: mysql sql

我正在记录用户的表单数据,并将该数据存储在MySQL数据库中。许多问题是是/否问题。经过一番研究后,我决定使用TINYINT获取数据类型。现在,如果其中一个问题需要文本输入,如果答案为“是”但如果答案为“否”则没有文本输入,显然我将需要一个VARCHAR用于该输入。

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

所以我的问题是......因为当TINYINT为0时,VARCHAR将始终为NULL,如果只有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列。

无论哪种方式都可以完成,任何一种方式都可以正常工作。但最佳做法是什么?如果您在处理由其他人设计的数据库时遇到任何一种方法,那么他们使用该方法而不是其他方法对您来说是否重要?

1 个答案:

答案 0 :(得分:0)

这真的很可选。我会选择只有一列并测试get 'welcome' => 'mypages#home', controller: "my_pages" s。否则,您必须考虑如何保持两个值同步。

不幸的是,MySQL既不支持约束也不支持计算列,因此保持一致性比它需要的更困难。

另一方面,你应该有一个表,每个用户和每个问题有一行。这比在列中添加问题更灵活。事实上,调查设计本身就是一门科学,但你必须考虑随着时间的推移添加,删除和修改问题。