我经常在我的数据库中使用(我称之为)“标志”列,例如:
Column 'Type':
0 = CREATOR
1 = OPERATIVE
2 = APPROVER
但这是正确的方法吗?我之所以问,是因为当我不记得零、一、二或三是什么意思时,稍后再讨论它可能会让人感到困惑。CREATOR
将它们简单地标记为etc不是更好吗?
这方面普遍接受的做法是什么?
标志通常是布尔值true
和false
或0
,并1
以bit
(MySQL 5.0.3+) 或tinyint
. 如果您有超过 2 个可能的值,则这些值可以存储在ENUM
MySQL 中,否则,这些可能的值应存储在它们自己的表中并使用外键关系(规范化)引用。
在索引方面,INTEGERS 优于 STRING。
但是你可以有另一个只存储roles
带有 aINT 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
。
您的问题的答案可能是此处描述的“枚举类型” 。这些允许您将字符串与数值关联为 MySQL 中的一种类型——这种做法在“真实”编程语言中很常见。
但是,您通常不想这样做,因为您特别想要对象的引用表。通常,名称是关系术语中的“实体”。这建议有一张桌子:
create table OperatorType (
OperatorTypeId int auto_increment primary key,
Name varchar(255)
)
在这种情况下,所有引用都将指向表中的 id,这将是一个整数。
不鼓励使用没有枚举类型或引用表的 id。据推测, 的目的name
是获得人类可读的输出。您不希望不同的查询(和查询编写者)为运算符类型发明自己的名称。相反,使用内置的数据库机制来正确处理这种情况。
VARCHAR
是在这种情况下使用的最糟糕的类型,正如其他人提到的你可能会考虑的那样ENUM
,INT
或者与角色的关系表。
区别在于:
ENUM
用于插入记录时您可以使用文字和数字作为值。再次选择时,您可以同时使用文字和数字,WHERE
但返回的值将是字符串,如果您想获取数字,则必须columnsname+0
在字段列表中进行选择。
使用时INT
您只能使用数字。
ENUM
因此,如果您在代码中创建一些静态常量来保存数值,这听起来应该会更好,一切都会变得更容易。
现在关系好于ENUM
?
如果您需要灵活性并希望从 PA 关系表中添加新角色是您应该考虑的唯一解决方案。
如果您的角色是恒定的并且永远不会改变ENUM
,则无需涉及 JOIN 会更好。
最好使用int
/ tinyint
。并始终使用comments
which 将帮助您记住所有值是什么。
数值在短路和比较方面更好。
枚举可以是一个选项。但是枚举值的常见问题是,如果你的标志在增加,那么它有点难以管理。
试试这个
make your type column a enum field and set the value like '0','1','2'
并在注释字段中写入 0 = CREATOR ,1 = OPERATIVE ,2 = APPROVER。它将帮助您记住这些值,当您一年后查看您的数据库时。
不要使用 VARCHAR。VARCHAR 仅对大小为 3 的字符串有效。
在这种情况下,您可以使用 CHAR(1) 并使用 C、O 和 A 的值作为提示符。
另一种消除代码记忆的方法是定义库函数来告诉你它是什么,例如:
function isCreator($value) {
if($value === 0) return true;
}
好问题。
我总是使用tinyint。它比 varchar 占用更少的空间,并且在速度和索引方面要好得多。我认识许多使用枚举的人,虽然我喜欢这个想法,但我更喜欢 tinyint 的灵活性。现场评论也是一个很好的工具,可以在未来非常有用。
除了我知道我存储的是二进制是/否值的情况外,我总是使用大于零的值。从长远来看,这可以避免很多混乱,因为 PHP 对 0 和 false 的评估是相同的(您从 Web 表单中收集值的一个大问题)。
是的,您可以将 int 用作“类型”列的数据类型 至于您担心以后会忘记从长远来看 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'
我希望这能有所帮助。