繁体   English   中英

MySQL使用NULL / NOT NULL VARCHAR代替TINYINT

[英]MySQL using NULL / NOT NULL VARCHAR instead of TINYINT

我正在记录来自用户的表单数据,并将该数据存储在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列。

两种方法都可以完成,任一种方法都可以。 但是最佳实践是什么? 如果您在使用其他人设计的数据库时遇到了这两种方法,那么您使用该方法而不是另一种方法对您来说是否重要?

这确实是可选的。 我将只使用一列并测试NULL 否则,您必须考虑如何使两个值保持同步。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM