【问题标题】:Which is the best way to store a gender column in MySQL for a web project哪个是在 MySQL 中为 Web 项目存储性别列的最佳方法
【发布时间】:2012-10-31 08:25:43
【问题描述】:

我已经构建了一个 JavaEE 项目,需要在 MySQL 中存储用户的性别。我想在添加新用户帐户时显示此属性。例如

<select name="gender">
    <option value="0">Male</option>
    <option value="1">Female</option>
</select>

现在我发现了 2 种方法可以将此属性存储在 MySQL 中。

  1. 使用整数/字符存储性别列:

    gender tinyint(1) not null;
    

    在这种情况下,我必须在我的 Java 代码中编写这些:

    public class StaticData {
        public static final short MALE = 0;
        public static final short FEMALE = 1;
    }
    

    如果是这样,我的数据库将依赖我的 Java 代码来限制值范围并解释 0/1 代表什么(低级别取决于高级别)。我认为这不是一个好主意。

  2. 使用枚举来存储性别列:

    gender enum("MALE", "FEMALE") not null
    

    在这种情况下,我的 Java 代码将取决于枚举的值。有两种方法可以获取这些值:

    1) public enum Gender { MALE, FEMALE },和方法一的问题几乎一样。

    2) 从 MySQL 中检索这些值,例如 "SHOW COLUMNS FROM user LIKE \"gender\"",然后使用正则表达式拆分字符串。但这是一种冗长的方法。每次加载 JSP 时都必须从 db 查询。我觉得会很贵。

这有一个常见的成语吗?如果不是,在为我的项目选择合适的解决方案时我需要考虑哪些因素?

【问题讨论】:

  • 我将使用 CHAR(1) 存储 F 或 M。它比 0,1 更具可读性。
  • 不要忘记其他选项,例如“其他”、“宁可不说”……
  • 还处理其他语言,以及您不知道的情况(未指定)。如果它们不适用,您也可以将其设为 BOOL 并故意让该字段代表 is_female,这样可以解决任何查看数据库或代码的人的大部分编程疑问。
  • @Mr47 怎么会有“其他”性别?

标签: mysql database enums


【解决方案1】:

可能大多数应用程序都不需要询问性别,但如果您绝对需要,我建议您也提供“其他”和“未知”选项,前者用于不完全符合二元性别模型的人,如果该人选择不透露,则另一个人。

对于这 4 个值,最简单的方法可能是将其作为 CHAR(1)ENUM("F", "M", "O", "U") 存储在您的数据库中(请注意,我按字母顺序选择了这些值,而不是令人惊讶的典型“男性优先”)。

【讨论】:

    【解决方案2】:

    我会创建一个以 id 作为键的“性别”表,并且应该向用户显示文本:

    • ID - 文字
    • 1 - 男性
    • 2 - 女性

    在 Person 中,您将性别 ID 保存为外键。

    当您想显示您加入的人时,可以将性别加入该人并打印出文本。 对于选择控件,您选择性别表中的所有行并使用这些行生成 html。

    如果有新的性别需要支持,直接在数据库中添加即可,无需编辑java代码...

    【讨论】:

    • 感谢您的回复,正如我所说,每次我加载我的 JSP 时,都会导致查询 db 检索这些值,这不是一个昂贵的开销吗?
    • 您想要缓存诸如性别表之类的数据,其中数据几乎永远不会改变。我们为此使用Ehcache。就算不缓存,这么小的表,便宜的select语句,也没关系。
    • 这是个好主意,它是您或所有业务项目的通用解决方案吗? :P
    • 我不知道是否有这样的模式;)性别之类的东西是“值范围”,您也可以在应用程序启动时加载它们并将它们保存在 java 内部。请记住,您必须重新启动应用程序才能使更改生效。
    • 不要忘记为将来可能需要的其他性别值做好准备,因为它们已被法律认可。这是德国的示例:lifesitenews.com/news/…
    猜你喜欢
    • 1970-01-01
    • 2021-04-23
    • 2010-11-25
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多