Php 标记列,Varchar还是INT?
我经常在我的数据库中使用(我称之为)“flag”列,例如:Php 标记列,Varchar还是INT?,php,mysql,Php,Mysql,我经常在我的数据库中使用(我称之为)“flag”列,例如: Column 'Type': 0 = CREATOR 1 = OPERATIVE 2 = APPROVER 但这是正确的方法吗?我之所以问这个问题,是因为当我不记得零、一、二、三是什么意思的时候,以后再讨论这个问题可能会让人困惑。简单地将它们标记为CREATOR等不是更好吗 一般公认的做法是什么?标志通常是布尔值true和false或0和1,用位(MySQL 5.0.3+)或tinyint表示。如果您有两个以上的可能值,那么这些值可
Column 'Type':
0 = CREATOR
1 = OPERATIVE
2 = APPROVER
但这是正确的方法吗?我之所以问这个问题,是因为当我不记得零、一、二、三是什么意思的时候,以后再讨论这个问题可能会让人困惑。简单地将它们标记为CREATOR
等不是更好吗
一般公认的做法是什么?标志通常是布尔值
true
和false
或0
和1
,用位(MySQL 5.0.3+)或tinyint
表示。如果您有两个以上的可能值,那么这些值可以存储在MySQL中的ENUM
,否则,这些可能值应该存储在它们自己的表中,并使用外键关系(规范化)进行引用。最好使用int
/tinyint
。并始终使用注释
,这将帮助您记住所有值是什么
数值在短路和比较方面更好
枚举可以是一个选项。但枚举值的常见问题是,如果您的标志在增加,那么它就有点难以管理 在索引方面,整数优于字符串。
但是您可以有另一个表,该表仅存储角色
,其中包含INT role\u id主键
和唯一的VARCHAR角色列
。然后,在user\u roles
中,将user\u id
和role\u id
作为指向角色的外键
- 这样,角色保持
INT
,但可以加入角色
表以获取其名称
- 当您需要使用
角色
文字时,您可以从角色
表中查询角色id
这是正常化。
PS:但根据用户群的不同,这可能有些过分。使用索引的VARCHAR角色列
不要使用VARCHAR,可能会更容易。VARCHAR仅对大于3的字符串有效
在本例中,您可以使用CHAR(1)并使用C、O和A的值作为提示
另一种消除代码记忆的方法是定义库函数,告诉您它是什么,例如:
function isCreator($value) {
if($value === 0) return true;
}
好问题。您的问题的答案可能是“枚举类型”,如下所述。这些允许您将字符串与数值关联为MySQL中的一种类型,这在“真实”编程语言中很常见
但是,通常情况下,您不想这样做,因为您特别想要对象的引用表。通常,名称在关系术语中是一个“实体”。这意味着要有一张桌子:
create table OperatorType (
OperatorTypeId int auto_increment primary key,
Name varchar(255)
)
在这种情况下,所有引用都将指向表中的id,该id将是一个整数
不鼓励使用没有枚举类型或引用表的id。大概,名称
的目的是使输出具有可读性。您不希望不同的查询(和查询编写器)为运算符类型发明自己的名称。相反,使用内置的数据库机制来正确处理这种情况。我总是使用tinyint。它比varchar占用更少的空间,并且在速度和索引方面都要好得多。我知道很多人使用enum,虽然我喜欢这个想法,但我更喜欢tinyint的灵活性。现场评论也是一个很好的工具,在今后的工作中会非常有帮助
除了我知道我在存储二进制是/否值的情况外,我总是使用大于零的值。从长远来看,这可以避免很多混乱,因为PHP的计算结果为零和false完全相同(这是从web表单收集值的一个大问题)。是的,您可以使用int作为列“type”的数据类型
至于您担心以后会忘记0,1,2代表什么,您可以随时以表列注释的形式提供描述
您可以通过执行以下alter查询来更改字段并向其添加注释:
ALTER TABLE `table_name` CHANGE `Type` `Type` INT( 2 ) NOT NULL DEFAULT '0' COMMENT '0 is CREATOR, 1 is OPERATIVE,2 is APPROVER'
我希望这能有所帮助。试试这个
make your type column a enum field and set the value like '0','1','2'
在“注释”字段中写为0=创建者,1=执行者,2=批准者。这将帮助您在一年后查看数据库时记住这些值 <代码> VARCHAR 是在这种情况下使用的最坏的类型,正如其他提到的,您可以考虑<代码> EnUM < /C>,<代码> INT/COM>或具有角色的关系表。p>
区别在于:
使用ENUM
插入记录时,可以使用文字和数字作为值。
再次选择时,您可以在中同时使用文本和数字,其中
返回的值将是字符串,如果您想获取数字,则必须在字段列表中选择列名称+0
使用INT
时,只能使用数字
所以听起来好像ENUM
应该更好,而且如果您创建一些静态常量来保存代码中的数值,一切都会变得更简单
现在关系是否比枚举更好
如果您需要灵活性,并且想从PA关系表中添加新的角色,则是唯一需要考虑的解决方案。
如果您的角色是固定的,并且永远不会改变,那么不需要加入联接,枚举就更好。创建另一个表?当PHP本能地知道值是什么时,创建另一个表只是为了记住值似乎很愚蠢。@Chud37它允许您在脚本中不硬编码值的情况下进行缩放。一点也不傻。。。对于大型站点。@Chud37“本能地”?从什么时候起PHP代码就有了直觉?@Chud37如果你理解规范化原则,这一点都不傻。为什么?enum
的要点是,您可以为不同的有效值指定适当的名称。如果您有时将数字字符串名作为数字传递,有时则作为字符串传递,那么为枚举指定数字字符串名是非常糟糕的。请参见中的