gpt4 book ai didi

MySQL 使用 NULL/NOT NULL VARCHAR 代替 TINYINT

转载 作者:行者123 更新时间:2023-11-29 21:51:54 24 4
gpt4 key购买 nike

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

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

所以我的问题是...由于当 TINYINT 为 0 时 VARCHAR 将始终为 NULL,因此仅使用 VARCHAR 并忘记"is"/“否”的 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 既不支持约束也不支持计算列,因此维护一致性比需要的更加困难。

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

关于MySQL 使用 NULL/NOT NULL VARCHAR 代替 TINYINT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33559298/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com