我已经构建了一个JavaEE项目,需要在MySQL中存储用户的性别。我想在添加新用户帐户时显示此属性。例如
<select name="gender">
<option value="0">Male</option>
<option value="1">Female</option>
</select>
现在我发现了两种在MySQL中存储此属性的方法。
使用integer / char存储性别列:
gender tinyint(1) not null;
在这种情况下,我必须在我的Java代码中写这些:
public class StaticData {
public static final short MALE = 0;
public static final short FEMALE = 1;
}
如果是这样,我的数据库将依赖于我的Java代码来限制值范围并解释0/1代表什么(低级别取决于高级别)。我认为这不是一个好主意。
使用枚举来存储性别列:
gender enum("MALE", "FEMALE") not null
在这种情况下,我的Java代码将取决于枚举的值。有两种方法可以获得这些值:
1)public enum Gender {MALE,FEMALE},它与方法1的问题几乎相同。
2)从MySQL中检索这些值,例如“SHOW COLUMNS FROM user LIKE \”gender \“”然后使用正则表达式来拆分字符串。但这是一种冗长的方法。每次加载JSP时都必须从db查询。我认为这会很贵。
这有一个共同的习惯用法吗?如果没有,在为我的项目选择合适的解决方案时,我需要考虑哪些因素?
答案 0 :(得分:2)
我会创建一个表为“Gender”的表,其中id为key,而Text应该显示给用户:
在Person中,您将gender-ID保存为外键。
当您想要显示您加入的人时,可以将性别加入此人并打印出文本。 对于选择控件,您可以选择性别表中的所有行,并生成带有行的html。
如果要支持新的性别,只需将其添加到数据库中,就不必编辑任何java代码......
答案 1 :(得分:1)
对于大多数要求性别的应用程序来说,
可能不是,但是如果绝对需要,我建议您也选择“其他”和“未知”,前者用于不完全符合二元性别模型的人,如果不选择披露则不然。
对于这4个值,最简单的方法可能是将其以CHAR(1)
或ENUM("F", "M", "O", "U")
的形式存储在数据库中(请注意,我是按字母顺序选择的,而不是令人惊讶的典型“男性优先”选项)