首页新闻招聘找找看知识库
  • 回复:26 浏览:10164 2010-06-10 11:02 来自 飞阿飞

    在设计数据表时,经常有性别,用户状态等字段这个字段,

    A,可以设计为varchar类型,然后存[男,女][正常,锁定,暂停]/优点:取值方便,不用在转换:缺点:点空间,如果想换称谓比较麻烦

    B,可以设计为int类型,然后存[1,0][0,1,2],与上面的相反

    大家讨论下应该怎么存储比较好!

     

    --------------------------------

    还有,如果把所有字段设计为非空,然后都设上默认值,这样好吗?


    -

     

  • 飞阿飞
    2010-06-10 11:45 飞阿飞
    唉,没人回呀,自己回下吧!
    第1楼 回到顶楼
  • 菩提树下的杨过
    2010-06-10 12:55 菩提树下的杨过
    如果只有二种状态,比如非男即女,当然用bit型最好(即可以强制对数据进行验证,又节省空间),如果有多种状态,视情况而定,用tinyint或char(x)型都可以
    第2楼 回到顶楼
  • 五星
    2010-06-10 21:58 五星
    当然用0|1了,不然有一天你的老板说不用男女了,用male,famale,或者公母,或者雌雄,那可怎么办
    第3楼 回到顶楼
  • 在梦想中流浪
    2010-06-11 10:13 在梦想中流浪
    一般都是bit类型的啊!
    第4楼 回到顶楼
  • 阿水
    2010-06-11 10:24 阿水
    用存储空间小的
    第5楼 回到顶楼
  • 技术,趋势
    2010-06-11 10:42 技术,趋势
    @菩提树下的杨过
    正解
    第6楼 回到顶楼
  • 布尔
    2010-06-11 11:01 布尔
    问题是小,但是类似的问题还会有很多,统一用代码表即可。
    第7楼 回到顶楼
  • 布尔
    2010-06-11 11:02 布尔
    国标有对性别做明确的规定
    第8楼 回到顶楼
  • LanceZhang
    2010-06-11 11:04 LanceZhang
    楼上说的对,最好除了男女之外,遵循国标,预留特殊值。

    但是,无论如何,用tinyint足够,不需要用int
    第9楼 回到顶楼
  • kyo-yo
    2010-06-11 11:46 kyo-yo
    不过在一些网站开发中还是有3种状态的,男,女,保密
    所以个人认为还是用tinyint或int把..
    第10楼 回到顶楼
  • 裸牛
    2010-06-11 11:57 裸牛
    偶一直都是int,然后用0 1 2 3等数字来标识,显示的时候搞个判断来处理
    第11楼 回到顶楼
  • blackcat
    2010-06-11 15:27 blackcat
    我还当是研究汇聚程度比较高的字段的存储和优化呢。搞了半天是这个。杯具。
    第12楼 回到顶楼
  • 孙长宇
    2010-06-11 17:10 孙长宇
    用什么都可以,取值的时候用一个适配器转换成枚举。
    第13楼 回到顶楼
  • 飞阿飞
    2010-06-12 08:39 飞阿飞
    真的很高兴大家这么热情讨论!
    第14楼 回到顶楼
  • 犇牛牛
    2010-06-12 09:10 犇牛牛
    数据字典问题 你说的性别只是一个字典类型而已 不用单独为它考虑字段类型 从整体考虑
    第15楼 回到顶楼
  • Cool it
    2010-06-12 11:25 Cool it
    第16楼 回到顶楼
  • Ivony...
    2010-06-12 13:07 Ivony...
    "1"和1以及"男"在不参与运算的情况下没有任何区别。

    如果呈现的时候是sexual == 1?"先生":"小姐",那么事实上与sexual=="男"?"先生":"小姐"没有区别。
    第17楼 回到顶楼
  • tp3cd
    2010-06-12 15:00 tp3cd
    @菩提树下的杨过
    正解

    同意正解。
    第18楼 回到顶楼
  • 吉日嘎拉 不仅权限管理
    是男就存男,是女就存女就可以了,搞那么复杂干啥?
    第19楼 回到顶楼
  • 飞阿飞
    2010-06-12 22:02 飞阿飞
    哈哈 吉日也来了!

    这个看似简单的东西,其实确实是怎么存都行!却有点不好取舍!
    第20楼 回到顶楼
  • ChangyuEx
    2010-06-13 09:07 ChangyuEx
    如果数据量很大(千万级以上)可以用tinyint,也不要在BL转换,那是蛋疼的症状。要知道数据库有一个名词叫“视图"。一般的应用就像吉日说的,没必要搞那么复杂。
    第21楼 回到顶楼
  • 菩提树下的杨过
    2010-06-13 09:40 菩提树下的杨过
    补充一下:直接存"男"or"女",并非不可,如果你的应用需求就是这样的,而且以后变化也不大,当然这样就可以了。

    但如果要考虑到其它因素,比如以后可以出英文版,要改成Male、Female显示,甚至其它语言版本(又或者要改成“先生",“小姐"这样的显示),理论上讲,在中文环境中“男"、“女"用nvarchar(1)就可以了(双字节环境),但是换成"Male,Female"长度可能就不一样了(前提是不在显示时做转换处理,仅仅只是想让数据库原始记录“好看"一点的情况下),所以不管是从哪一方面来讲,对于"非此即彼"的状态,用bit综合考虑是比较适合的。

    当然,如果对于"男","女","保密"这种扩展为三种情况下的状态,用tinyint从存储空间上讲是比较经济的,但是tinyint不允许为负数,有时候会忘记0,1,2,到底0是男,还是0是女,我习惯于改用smallint,浪费一点空间,男记作+1(男的是阳性,为正),女记作-1(女的是阴性为负),不男不女(保密)无所谓阴阳,为0,方便记忆.哈


    另外第二个问题,把所有字段设置为非空,然后给默认值,通常这样做的目的,就是为了避免null值的额外处理所带来的开销,但是要注意的是,对于linq to sql之类的orm解决方案,即使你在数据库字段上设置了默认值,对于nvarchar类型(在c#中为string类型)的字段,如果你创建一个实体,然后不设置任何值,该类体的对应字段值默认是为null的,这样在提交到数据库时,一样会报错(因为数据库不允许null),所以如果你这样设计了,在linq to sql这样的环境下,新插入一个记录时,对于string类型的字段,最好还是赋值一个空字符串,比如 product.Name=“";然后再提交
    第22楼 回到顶楼
  • Kylinhe
    2010-06-13 12:32 Kylinhe
    若要通用,请考虑到到泰国的国情。世界卫生组织也允许性别待定的情况。
    建议使用Tinyint,管他何种需求和国际化,转换一下就好。
    第23楼 回到顶楼
  • ㄟ荖樹炪厊ㄖ
    2010-09-13 09:34 ㄟ荖樹炪厊ㄖ
    路过~~~
    第24楼 回到顶楼
  • letmedown
    2014-12-18 17:58 letmedown
    但是公司的项目中使用了一个BeanUtil工具,当页面传过来的是空值时会把int值转换为0.
    所以公司项目使用的是其它的字典值。
    当前如果考虑设计的习惯性可以用1表示男2表示女。
    (我不习惯用负数)
    第25楼 回到顶楼
  • 徒徒to
    2015-10-30 08:42 徒徒to
    @孙长宇
    原谅我又翻旧帖了. "适配器转换成枚举"具体怎么做呢,能给个栗子吗?
    第26楼 回到顶楼
登录后才能评论,请先登录注册