【问题标题】:Best practices for putting values inside sql enums将值放入 sql 枚举的最佳实践
【发布时间】:2017-09-24 09:57:05
【问题描述】:

我的 mysql 表中有两个枚举列:

gender enum('male', 'female') not null,
user_type enum('hr', 'manager', 'qa') not null

我的一位同事坚持认为,在所有枚举值中都使用小写字母不是一个好主意,因为它在页面中看起来不太好。例如,

// profile.php
用户类型:HR(代表人力资源)
性别:男

应该是:

// profile.php
用户类型:HR
性别:男

我忽略案例的主要原因是我将多次比较这些列的值。例如:

if (user_type == "hr")

如果我只是因为大小写不匹配而出现错误,那将是非常烦人的。那么性别栏呢?大写真的好吗?

我想 UI 端可以像这样大写它:

<?php echo strtoupper($userType) ?>

我对sql没有太多了解,所以我想问一下:关于枚举值的大小写约定是否有最佳实践?注意我不是在谈论命名枚举列。

【问题讨论】:

  • 嗯,你可以使用不区分大小写的排序规则(大多数“默认”排序规则都是)——但无论哪种方式,在你的 CSS 中控制这种东西都很容易
  • 为您的目的使用任何实用的东西。严格遵守大小写是一个问题。例如,在表格上使用适当的大小写可能看起来不错,但在报告中,即有 5 名男性和 5 名女性主管,如果使用适当的大小写会看起来很奇怪。
  • 这个问题要么基于意见,要么过于宽泛(或两者兼而有之)。您甚至可以争论在 MySQL 中使用 ENUM 是否是个好主意。但是我认为您需要确定在代码中使用的是数据还是内部密钥。明天他们希望您将“HR”更改为“员工”,而您的代码 (user_type == "HR") 将不再有效,因为数据已更改。最好有某种映射 - 在数据库中 (gender_key, gender_label) 或在您的应用程序中 ($labels['male'] = 'Male'echo $labels[$genderKey])。要支持多种语言,您必须采用任何一种方式。

标签: php mysql sql enums


【解决方案1】:

如果您问的是最佳实践,那么。您应该使用大写的ENUM 值。因为,它们是常数。

而且,AFAIK,在所有编程语言中声明为 UPPERCASE 的常量。

【讨论】:

    【解决方案2】:

    根据我的经验,在我使用的所有具有枚举概念的语言中,无论是在文档中还是在该语言提供的库中定义的枚举中,枚举都不是用大写或小写写的,而是它们使用驼峰式大小写的一些变体,例如Small, Medium, BigszSmall, szMedium, szBig。一些例子:

    当然,在所有这些示例中,枚举值都不是字符串,它们具有名称和值,因此您在比较和输出方面都没有问题(因为您会输出它的 值 em>,而不是它的名称)。

    由于在 MySQL 中,如果您将枚举的值用于任何输出,则该值也是名称,您应该使用在该输出中更有意义的大小写(与列是常规 @ 时使用的相同) 987654329@ 列),例如'HR','Management','QA'。如 cmets 中所述,默认排序规则应该已经不区分大小写,因此您在比较或连接时不会遇到问题。

    在 PHP 中你可以使用 strcasecmp() 或者如果你出于任何原因不喜欢它 strtolower()/strtoupper():

    if (strcasecmp(user_type,"hr")==0) // best options IMO
    if (strcasecmp(user_type,"HR")==0) // best options IMO
    if (strtolower(user_type)=="hr")
    if (strtoupper(user_type)=="HR")
    

    这并不是说我反对始终使用一致的大小写,事实上,我一直使用它,并且我在不需要它的情况下使用不区分大小写的语言工作了很多时间。但优先级是程序提供所需的结果,因为您编写代码不是(仅)为了好玩而是为了实现某些目标,如果命名部门的正确方法是'HR','Management','QA',您不能使用'hr','management','qa',因为它看起来在你的代码中更漂亮。

    也就是说,如果枚举仅在内部使用,例如因为您仅将它们用作 id 并且描述存储在 Descriptions 表中,那么请使用最适合您和您的同事的案例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-09
      • 2011-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多