2

我经常在我的数据库中使用(我称之为)“标志”列,例如:

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

但这是正确的方法吗?我之所以问,是因为当我不记得零、一、二或三是什么意思时,稍后再讨论它可能会让人感到困惑。CREATOR将它们简单地标记为etc不是更好吗?

这方面普遍接受的做法是什么?

4

9 回答 9

5

标志通常是布尔值truefalse0,并1bit(MySQL 5.0.3+) 或tinyint. 如果您有超过 2 个可能的值,则这些值可以存储在ENUMMySQL 中,否则,这些可能的值应存储在它们自己的表中并使用外键关系(规范化)引用。

于 2013-07-15T13:12:24.353 回答
1

在索引方面,INTEGERS 优于 STRING。

但是你可以有另一个只存储roles带有 aINT role_id primary key和的表UNIQUE VARCHAR role column。然后,在您的user_roles, 中有user_idrole_id作为FOREIGN KEY指向roles`.`role_id.

  • 这样角色就保留了INT,但可以JOINEDroles表中来获得它的名字。
  • 当您需要使用role文字时,您可以role_idroles表中查询。

是常态化。

PS但根据您的用户群,这可能是矫枉过正。你可能会更容易逃脱indexed VARCHAR role columns

于 2013-07-15T13:15:55.850 回答
1

您的问题的答案可能是此处描述的“枚举类型” 。这些允许您将字符串与数值关联为 MySQL 中的一种类型——这种做法在“真实”编程语言中很常见。

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

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

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

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

于 2013-07-15T13:19:57.320 回答
0

VARCHAR是在这种情况下使用的最糟糕的类型,正如其他人提到的你可能会考虑的那样ENUMINT或者与角色的关系表。

区别在于:

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

使用时INT您只能使用数字。

ENUM因此,如果您在代码中创建一些静态常量来保存数值,这听起来应该会更好,一切都会变得更容易。

现在关系好于ENUM?

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

如果您的角色是恒定的并且永远不会改变ENUM,则无需涉及 JOIN 会更好。

于 2013-07-15T13:45:23.163 回答
0

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

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

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

于 2013-07-15T13:12:53.010 回答
0

试试这个

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

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

于 2013-07-15T13:24:59.237 回答
0

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

Varchar Mysql 参考

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

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

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

好问题。

于 2013-07-15T13:19:26.123 回答
0

我总是使用tinyint。它比 varchar 占用更少的空间,并且在速度和索引方面要好得多。我认识许多使用枚举的人,虽然我喜欢这个想法,但我更喜欢 tinyint 的灵活性。现场评论也是一个很好的工具,可以在未来非常有用。

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

于 2013-07-15T13:20:09.483 回答
0

是的,您可以将 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'

我希望这能有所帮助。

于 2013-07-15T13:24:47.423 回答