我正在为一个新项目创建一个数据库结构,并且有一个表,其中一个字段将从网站上的选择框中选择时接收/包含三个值中的一个。这些值是(打开,暂停,关闭)是否需要创建varchar类型的字段(某个值)或者有更好的方法吗?还有一些时候生病的人会接受两个值中的一个是yes或no,我通常只设置varchar(3)类型的字段。我想以正确的方式做到这一点,我可以为这些类型的实例设置其他类型的字段吗?
感谢
PS:
在表中创建列时,将字段设置为非空的目的是什么?当开发人员没有为所需的字段插入值时,所有这一切都会显示错误。所有检查都可以在客户端或服务器端完成,它的目的是通过数据库完成吗?它是否只是让开发人员仔细考虑数据输入所需的字段?
答案 0 :(得分:6)
查看enum类型。它允许您拥有一定数量的选项,因此通常更有效。
答案 1 :(得分:2)
理想情况下,我实际上有一个整数字段,它是另一个表的外键,如:
MyTable
Field1 varchar(10)
State integer
States
State integer primary key
Desc varchar(50)
这将减轻您在数据库中占用太多空间时可能遇到的任何问题。另一个解决方案是使用硬编码的整数来指定状态,但这会在您的数据库和应用程序之间引入不必要的绑定。
关于使用"not null"
的问题,DBMS应该完全负责自己的数据完整性。谁说应用程序A依赖于一个列不能包含NULL并且应用程序B出现并插入它们(bug,无能力编码器或任何其他原因)这一事实?
这可能会破坏应用程序A.控制DBMS中的数据的正确位置是DBMS。
答案 2 :(得分:1)
TINYINT unsigned
通常是更好的字段类型,尽管ENUM
也是可能的。我倾向于避免使用ENUM
,因为如果必须进行数据库更改,在代码中推出新值会有点麻烦。
TINYINT
只占用一个字节的存储空间,最多可以表示256个不同的值,而不是存储一个“暂停”的varchar,它占用9个字节,加上一个前缀字节。在这种情况下,我会使用0,1和2分别表示“打开”,“暂停”和“关闭”。同样,ENUM
允许您使用文本表示而不是整数,但如果要添加新值,则需要更改列。
关于NOT NULL
的问题,是的,这是一种用于帮助确保数据完整性的方法。如果你有远见使它成为你的桌子结构的一部分,这是非常有用的。
答案 3 :(得分:0)
ENUM('opened', 'suspended', 'closed')
答案 4 :(得分:0)
我通常在这些情况下使用ENUM。
PS - NULL是一个不同于空的值