C# 实现一个只包含两行女性和男性的单独表是一种不好的做法吗?

C# 实现一个只包含两行女性和男性的单独表是一种不好的做法吗?,c#,asp.net,database-design,C#,Asp.net,Database Design,假设我们有一个包含3列的Person表: int类型的PersonId。(主键) 字符串类型的名称 GenderId类型为int(外键引用Gender表) Gender表由两列组成: int类型的GenderId 字符串类型的名称 我的问题是: 是否值得实施Gender表?还是会导致性能下降?处理这个问题的最佳方法是什么 编辑1: 我必须在UI中用固定性别(女性和男性)的列表填充下拉控件 在这种情况下,将性别标准化到一个单独的表中是过分的。 为什么不在第一个表中将GenderType作为字符串

假设我们有一个包含3列的
Person
表:

  • int
    类型的
    PersonId
    。(主键)
  • 字符串类型的
    名称
  • GenderId
    类型为
    int
    (外键引用
    Gender
    表)
  • Gender
    表由两列组成:

  • int
    类型的
    GenderId
  • 字符串类型的
    名称
  • 我的问题是: 是否值得实施
    Gender
    表?还是会导致性能下降?处理这个问题的最佳方法是什么

    编辑1:
    我必须在UI中用固定性别(女性和男性)的列表填充下拉控件

    在这种情况下,将性别标准化到一个单独的表中是过分的。 为什么不在第一个表中将GenderType作为字符串


    这样,您就不必生成和存储额外的GenderID(尽量减少ID的使用,否则一个表中的所有列都会指向其他表……过度规范化)

    如果一个字段只有两个可能的值,则不需要另一个表。你可以只使用
    位(0=男性,1=女性)或
    字符('M'和'F')。

    考虑到你只有两种可能的性别,而且这在未来极不可能需要改变,我不想麻烦有一个单独的表。只需在Person表中添加一列即可。如果需要,联接可以是有效的,但它总是比不联接慢


    如果出于任何原因,您觉得需要两种以上的可能性别,您仍然可以将它们存储在Person表的一列中。

    我认为在这种情况下,最好的方法是折衷:

  • 创建一个名为Gender的表,其中包含一个名为“Name”或“Gender”的varchar列。性别确实是一个自然的主键。把“男性”和“女性”的值放进去
  • 在名为“性别”的列上为Person表创建外键
  • 现在,您只需要从一个表中进行查询,但外键仍然可以防止数据不一致,如果愿意,您可以从性别表中提取下拉列表的值。两全其美


    此外,它使在数据库中工作的人的生活更轻松,因为他们不需要记住您分配给男性/女性的任意ID。

    除了其他人所说的之外,您还可以创建一个索引(PersonId、GenderId)以加快计算速度

    我坚信这方面的查找表——这基本上就是我们提出的,但有一个区别:使用友好的非自动生成的PK

    例如,PKs可能是:“M”、“F”、“N”(根据公认的性别分类,可能有2-4行左右)。使用简单的PK允许轻松查询,同时仍然允许更高形式的规范化和引用一致性约束,而无需使用检查约束

    正如问题所提出的,我还使用了额外的列,如适当的名称/标题/标签(这些列用作参考,并向身份添加自我文档)。麦卡锡主张使用这一数据本身作为PK(这是一种选择),但我认为这是身份的特征,使用更简洁的手拣PK。< /P>
    从这个意义上说,我持有查找表的整个概念,以提供与代码中的“常量”相同的角色。

    有什么原因不能将性别作为Person表中的一列吗?@shrodes-他提出的方法更加规范化,这是一项崇高的事业。当只有两个不同的值时,为什么要在数据库中存储字符串“Male”或“Female”数千次?问题是,从实用角度来看,这是否是一个好主意。@Greg是的,我同意这是一项崇高的事业,我也认为在这种情况下,这是不必要的normalization@shrodes:稍后将通过从UI上的下拉控件中选择选项来填充性别列。我这样做是为了避免手动输入数据时容易出错。我会坚持这样做。任何性能下降都可以忽略不计。不要为了性能而破坏数据模型。请注意,有时您会进行反规范化,或者完全使用启动方案或类似方案来创建不同的数据库(用于报告目的)。你这样做的方式在UI中也有帮助,也就是说,你可以使用查找表填充下拉列表等。当然,在我工作过的大多数系统中,性别表中有两个以上的项目。如果这种情况发生在这里,你就得走了。只需将其他人添加到查找中。你确定一个人或患者只会自我识别两种可能的性别吗?我当然可以想象将其限制为两种选择。标准有4种选择。。。但正如您所建议的,应该仍然存储在Person表的一列中。@sasprog:LOL,不,谢谢。除非我为一个客户工作,而这个客户觉得有必要去钻研和接受那种电脑垃圾,否则我自己的项目将把它限制为两种选择。为什么要投反对票?同意,只有你可能想称之为IsMale或IsFemale。常数的选择对所有人来说都不明显。。。显然:)@Mark:+1表示
    。但是对于
    CHAR
    ,Bit是一个可怕的建议。非常不必要、不直观,而且在技术上也不正确。在各个层面上都是错误的。因此我投了反对票。虽然“性别”这几天真的只是一个小字段吗?@Noon如果只有两个值,那么它只是一个信息。如果严格来说这是一个布尔值,那将是另一回事。@p.campbell至少我们没有讨论“性”应该如何标准化;-)使用另一个表可以增加引用完整性。最好的部分是它可以是第一个表中的一个字符串,并且仍然可以在数据库模型中强制执行——我更喜欢手工选择的代理PK(例如带有attrib的“M”、“F”)