正常化性别表走得太远了吗?

时间:2010-08-18 15:12:53

标签: wpf database database-design

我不是数据库人,但我正在尝试清理另一个数据库。所以我的问题是,将性别表格标准化会走得太远吗?

User table:
userid int pk,
genderid char(1) fk
etc...

gender table:
genderid char(1) pk,
gender varchar(20)

现在起初它对我来说似乎很愚蠢,但后来我考虑了它,因为我可以有一个恒定的数据源来填充或绑定。我将使用WPF。如果它是另一个框架我可能会避免它,但你怎么想?

7 个答案:

答案 0 :(得分:11)

您是否选择规范化表格结构以容纳性别将取决于您的应用程序和业务要求的要求。

如果符合以下条件我会正常化:

  • 您希望能够在数据库中管理性别的“描述”,而不是代码。
    • 这使您可以快速将描述从男/女改为男/女。例如。
  • 您的申请目前必须处理或将来可能处理本地化要求,即能够以不同语言指定性别。
  • 您的业务需要将所有内容都规范化。

如果符合以下条件我不会正常化:

  • 您有一个相对简单的应用程序,您可以在代码中而不是在数据库中轻松管理性别描述。
  • 您可以对进出性别字段的数据进行严格的程序控制,以确保该字段中数据的一致性。
  • 您只关心性别字段以获取信息,这意味着,一旦第一次设置此字段,您就没有很多程序化需求。

答案 1 :(得分:3)

我也不是数据库人,但我这样做。它让我有可能确保只输入性别(参考完整性),我也可以使用它来填充选择控件。

答案 2 :(得分:3)

我可以想到我在性别和性别上使用不同列的应用程序,有三个性别值(男性/女性/拒绝状态)和六个性别(男性/女性/变性男性/变性女性/无性别) /拒绝陈述)。当然,我住在旧金山,那里有一系列关于跨性别问题的公众讨论,世界其他地方的大部分都是在曲线背后。

重点是:没有令人信服的理由不这样做,我认为我对人口统计学所做的任何简化假设都是有限的和狭隘的。将性爱打破到自己的桌子的成本现在很小,后来很昂贵。我不会在假设的基础上避免小额费用。

答案 3 :(得分:1)

好吧,贵公司可能要求尽可能将所有内容都标准化。

此外,取决于业务和&数据,你可能还需要包括变性人,这会产生3个以上的性别(我不知道有多少,但没有检查)

答案 4 :(得分:0)

我会在另一个方面说:排序。通常,'M'在'F'之后排序;在一个项目中,数据库表有一个带有这两个值之一的性别字段。希望能够对性别(人口普查数据)的结果进行排序,并进一步优先在'F'之前出现'M'。我的解决方案是添加一个单独的查找表,为Male值指定一个ID为0,将Female指定为ID为1.因此,主表上的查询可以很容易地在新的genderID字段上进行排序。

答案 5 :(得分:0)

以为我会在这里发表意见。 @Ben McCormack有一个很好的答案,但有一个小小的警告:关于本地化,有时候比在数据库中直接定义值更好的方法。

例如,你提到了WPF。使用.Net,您可以获得各种本地化资源,这些资源更适合管理是否发出“男性”或“Samec”(捷克语)的差异。

通过让内置的本地化功能处理这个问题,您不必担心有多个数据库记录定义完全相同的事情......这可能会使报告复杂化。


那就是说,我建议您可以考虑“性别”是否真的是您所追求的。性别被定义为“一组区分男性和女性的特征”。

从表面上看,这听起来像是标准的男/女选择;但事实并非如此。性别要复杂得多,因为它需要具有意义的背景。例如,在关系的背景下,男性(按性别)可能具有几种“性别”中的一种:男性,女性甚至中性。这与他们的伴侣的性别无关。

在个人的情况下,男性(按性别)可能是男性,女性,中性,变性,跨性别或填写表格的人可接受的任何其他选项。

至少有一个人评论说,性别是必要的,以确定邮件中使用的敬语。我建议性别与敬意之间没有关系。例如,女性(按性别)可能希望以女士/小姐/夫人/医生/女士/教授或甚至先生为主,如果他们正在进行手术或已完成手术以成为“男性”。该列表绝不是包罗万象的,无论如何,让这个人选择他们想要解决的方式会好得多。


这引导我进入我的最后一项:在收集任何数据之前,您应该有明确的理由。我公司专门通过在线表格收集数据。我们要做的一件事就是看看客户要求的内容,并逐个字段地确定数据是否在任何地方都可以使用。

实体(公司/政府/等)往往要求提供的信息比他们关心的要多得多。如果数据丢失,被盗或未经授权的个人查看,这可能会产生额外的后果。此外,填写每个要求完成的字段的表格的人员也有负担。

我提出这个问题是因为任何正常系统几乎都不需要“性别”。相反,性是一个更好的资格者,即便如此,它几乎没有价值。免除交友网站和政府人口普查。

答案 6 :(得分:-2)

是。我认为您可以在代码中使用枚举并将eventuatly绑定到它。

null - unknow; 0 - 男; 1 - 女性;

或者您可以使用bool类型来定义此

null - unknow;真 - 男;假 - 女性