标志列,Varchar还是INT?

时间:2013-07-15 13:10:31

标签: php mysql

我经常在我的数据库中使用(我称之为)'flag'列,如下所示:

Column 'Type':
0 = CREATOR
1 = OPERATIVE
2 = APPROVER 

但这是正确的方法吗?我只是问,因为当我不记得零,一,二或三的意思时,可能会让人感到困惑。简单地将它们标记为CREATOR等不是更好吗?

对此普遍接受的做法是什么?

9 个答案:

答案 0 :(得分:5)

标志通常是布尔truefalse01bit(MySQL 5.0.3+)中表达,或{ {1}}。如果您有两个以上的可能值,那么这些值可以存储在MySQL中的tinyint中,否则,这些可能的值应该存储在它们自己的表中并使用外键关系引用(规范化)。

答案 1 :(得分:1)

在索引方面,INTEGERS比STRING更受青睐。

但是你可以有另一张表只存储roles INT role_id primary keyUNIQUE VARCHAR role column。然后,在user_roles中,将user_idrole_id作为FOREIGN KEY指向roles`.`role_id

  • 这样,该角色会保留INT,但JOINED可以roles来获取其名称。
  • 当您需要使用role字面值时,可以从role_id表中查询roles

这是正常化。

PS 但根据您的用户群,它可能有些过分。 indexed VARCHAR role columns可能会让您更轻松。

答案 2 :(得分:1)

您的问题的答案可能是“枚举类型”,其中描述了here。这些允许您将字符串与数值相关联作为MySQL中的类型 - 这是“真正的”编程语言中常见的做法。

但是,通常,您不希望这样做,因为您特别需要对象的引用表。通常,名称是关系术语中的“实体”。这表明有一张桌子:

create table OperatorType (
    OperatorTypeId int auto_increment primary key,
    Name varchar(255)
)

在这种情况下,所有引用都将是表中的id,它将是一个整数。

不鼓励使用不带枚举类型或引用表的id。据推测,name的目的是具有人类可读的输出。您不希望不同的查询(和查询编写者)为运算符类型创建自己的名称。相反,使用内置数据库机制来正确处理这种情况。

答案 3 :(得分:0)

最好使用int / tinyint。并始终使用comments,这将帮助您记住所有值是什么。

数字值在短路和比较方面更好。

Enum可以是一个选项。但是枚举值的常见问题是如果你的标志正在增加,那么它有点难以管理。

答案 4 :(得分:0)

不要使用VARCHAR。 VARCHAR仅对大小超过3的字符串有效。

Varchar Mysql Reference

在这种情况下,您可以使用CHAR(1)并使用C,O和A的值作为tickler。

删除代码记忆的另一种方法是定义库函数,告诉你它是什么,如:

function isCreator($value) {
  if($value === 0) return true;
}

好问题。

答案 5 :(得分:0)

我总是使用tinyint。它比varchar占用更少的空间,并且速度和索引更好。我知道很多人使用枚举,虽然我喜欢这个想法,但我更喜欢tinyint的灵活性。现场评论也是一个很好的工具,可以在未来发挥作用。

除了我知道我存储二进制是/否值的情况外,我总是使用高于零的值。从长远来看,这可以节省很多混乱,因为PHP评估零和错误相同(您从Web表单中收集价值的一个重要问题)。

答案 6 :(得分:0)

是的,您可以使用int作为“type”列的数据类型 至于你担心从长远来看会忘记0,1,2个替代品,你可以随时提供描述作为表格列的评论

通过执行以下更改查询来更改字段并为其添加注释:

ALTER TABLE `table_name` CHANGE `Type` `Type` INT( 2 ) NOT NULL DEFAULT '0' COMMENT '0 is CREATOR, 1 is OPERATIVE,2 is APPROVER'

我希望这可以提供一些帮助。

答案 7 :(得分:0)

尝试这个

make your type column a enum field and set the value like '0','1','2' 

并在注释字段中写为0 = CREATOR,1 = OPERATIVE,2 = APPROVER。当您在一年后查看数据库时,它将帮助您记住这些值。

答案 8 :(得分:0)

VARCHAR是此方案中使用的最差类型,正如其他人所提到的那样您可以考虑使用ENUMINT或具有角色的关系表。

差异是:

使用ENUM插入记录时可以使用文字和数字作为值。 再次选择时您可以在WHERE中使用文字和数字,但返回的值将是字符串,如果您想获得数字,则必须在字段列表中选择columnsname+0

使用INT时只能使用数字。

所以听起来ENUM应该更好,如果你创建一些静态常量来保存你的代码中的数值,一切都会变得更容易。

现在关系比ENUM好吗?

如果您需要灵活性并希望从PA关系表中添加新角色,那么您应该考虑唯一的解决方案。

如果你的角色是不变的并且永远不会改变ENUM则更好,而不需要涉及JOIN。

相关问题