我经常在我的数据库中使用(我称之为)'flag'列,如下所示:
Column 'Type':
0 = CREATOR
1 = OPERATIVE
2 = APPROVER
但这是正确的方法吗?我只是问,因为当我不记得零,一,二或三的意思时,可能会让人感到困惑。简单地将它们标记为CREATOR
等不是更好吗?
对此普遍接受的做法是什么?
答案 0 :(得分:5)
标志通常是布尔true
和false
或0
和1
在bit
(MySQL 5.0.3+)中表达,或{ {1}}。如果您有两个以上的可能值,那么这些值可以存储在MySQL中的tinyint
中,否则,这些可能的值应该存储在它们自己的表中并使用外键关系引用(规范化)。
答案 1 :(得分:1)
在索引方面,INTEGERS比STRING更受青睐。
但是你可以有另一张表只存储roles
INT role_id primary key
和UNIQUE VARCHAR role column
。然后,在user_roles
中,将user_id
和role_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的字符串有效。
在这种情况下,您可以使用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
是此方案中使用的最差类型,正如其他人所提到的那样您可以考虑使用ENUM
,INT
或具有角色的关系表。
差异是:
使用ENUM
插入记录时可以使用文字和数字作为值。
再次选择时您可以在WHERE
中使用文字和数字,但返回的值将是字符串,如果您想获得数字,则必须在字段列表中选择columnsname+0
。
使用INT
时只能使用数字。
所以听起来ENUM
应该更好,如果你创建一些静态常量来保存你的代码中的数值,一切都会变得更容易。
现在关系比ENUM
好吗?
如果您需要灵活性并希望从PA关系表中添加新角色,那么您应该考虑唯一的解决方案。
如果你的角色是不变的并且永远不会改变ENUM
则更好,而不需要涉及JOIN。