데이터베이스에 성별 (성별) 저장


130

가능한 한 적은 (크기 / 성능) 비용으로 데이터베이스에 사용자의 성별을 저장하고 싶습니다.

지금까지 3 가지 시나리오가 떠 오릅니다.

  1. INT - 코드에서 열거 정렬 (1 = 남성, 여성 2 = 3 = ...)
  2. 숯 (1) - 스토어 m , F 또는 다른 단일 문자 식별자
  3. 비트 (부울) - 이 옵션에 적합한 필드 이름이 있습니까?

내가 묻는 이유는 문자 가 부울 보다 작다 는 언급 이 답변 때문입니다 .

나는 MS SQL 2008, 사용하고 있음을 명확히해야 합니까 비트 데이터 유형을 가지고 사실을.


1
FWIW, 당신이 언급 한 SO 질문은 .NET이 메모리에서 이러한 유형을 나타내는 방법을 나타냅니다. SQL Server가이를 나타내는 방법과는 아무런 관련이 없습니다. 비트 <= 문자. msdn.microsoft.com/ko-kr/library/ms177603.aspx
— Matt

1
성별 입력란을 무엇에 사용하십니까? 그냥 문자열 일 수있어 사람들이 원하는 것을 입력 할 수 있습니까? 이 질문에 대한 가능한 모든 답변을 열거하는 것은 까다로울 것입니다.
— 43 초에

@ ThePassenger : 일반적인 옵션은 기본적으로 m / f / other라고 생각하므로 제안 한 것처럼 삼항이 좋습니다. "other"와 "unspecified"를 구별하고 싶을 수도 있습니다 ( "말하고 있지 않습니다"및 / 또는 "아직 사용자에게 묻지 않았습니다"). 저는 유동적 인 사람들이 매일 설정할 수있는 슬라이더로 부동 소수점 값을 원하는 것을 알지 못합니다. 내 생각에 그들 대부분은 (그리고 다른 전통적으로 성별이 아닌 사람들) 거의 모든 웹 사이트에서 "기타"또는 "지정되지 않은"것을 골라서 기뻐할 것입니다. 그러나 아니요, "성별"대신 "성"을 요구하는 것이 좋은 생각이 아닙니다.
— Peter Cordes

1
@PeterCordes 나는 우리 마을에서 당신의 남자, 여자, 또는 소인 "성 유체"에 대해 잘 모르고 있습니다. 장르가 유동적이라면 컴퓨터 소리에 대한 가치 척도를 만드는 것이 약간 요구되는 것처럼 보입니다. 우리 나라에서는 오히려 성관계를 요구합니다. 덜 복잡합니다. 우리가 지금까지 석기 시대에 있다고 믿지 마세요! 우리는 이미 하나님을 발견했으며 마지막 식민지 이후 대부분의 일신 론자입니다.
— Monica에 대한 Revolucion

2
@PeterCordes : 현재 정치 환경에서 그러한 것들을 요구하면 사람들이 부동 값 슬라이더를 포함하자마자 다른 사람들보다 우위를 제공함으로써 사람들에게 이점을 줄 것이므로 누군가는 다차원적인 것을 요구할 것입니다. "단 하나의 슬라이더? 석기 시대에 있습니까?"
— vsz

답변:


82

열을 "성별"이라고합니다.

Data Type   Bytes Taken          Number/Range of Values
------------------------------------------------
TinyINT     1                    255 (zero to 255)
INT         4            -       2,147,483,648 to 2,147,483,647
BIT         1 (2 if 9+ columns)  2 (0 and 1)
CHAR(1)     1                    26 if case insensitive, 52 otherwise

BIT 가 불충분하다 두 가지 성별을 지원하기 때문에 데이터 형식은 배제 될 수있다. INT 는 3 개 이상의 옵션을 지원 하지만 4 바이트가 필요합니다. 더 작거나 좁은 데이터 형식으로 성능이 향상됩니다.

CHAR(1)TinyINT 보다 우위에 있음 -둘 다 동일한 바이트 수를 사용하지만 CHAR은 더 좁은 수의 값을 제공합니다. 사용CHAR(1) 대리 / 인공 키라고도 수치 데이터의 사용을 대, "m", "F"등 천연 키를 사용하여 확인한다. CHAR(1)포팅이 필요한 경우 모든 데이터베이스에서 지원됩니다.

결론

옵션 2 : CHAR (1)을 사용합니다.

추가

카디널리티가 낮은 열의 인덱스에 값 이 없으므로 성별 열의 인덱스가 도움 이 되지 않을 수 있습니다. 즉, 인덱스 값이 다양하지 않아 값을 제공 할 수 없습니다.


성능에 대한 언급이 있습니까? 나는 그것이해서는 안되는 거의 마이크로 최적화라는 것을 알고 있지만 호기심이 많은 음식입니다.
— Marko

감사합니다 @OMG Ponies, 성능은 어떻습니까? 이 경우 문자가 비트보다 가장 비쌀까요?
— Marko

4
@Marko : 앞서 말했듯이, 그들은 같습니다. 그러나 낮은 카디널리티 열의 인덱스에 값이 없기 때문에 인덱스가 도움 이 되지 않을 수 있습니다. 즉, 인덱스 값이 다양하지 않아 값을 제공 할 수 없습니다.
— OMG Ponies

1
64 비트 플랫폼에서 성능이 실제로 4 바이트 데이터 유형을 사용하는 것이 얼마나 낫 습니까? 그냥 말하기 ... ;-)
— Craig

1
성별이 두 개뿐이므로 조금 고수 할 것입니다. 그러나 OP의 초기 질문은 남아 있습니다. 열 이름은 무엇입니까? "IsMale"또는 "IsFemale"은 조금 이상합니다 ...
— Mateus Felipe

180

이미 ISO 표준이 있습니다. 자신의 계획을 만들 필요가 없습니다.

http://en.wikipedia.org/wiki/ISO_5218

표준에 따라 열의 이름은 "Sex"여야하며 '가장 가까운'데이터 유형은 CHECK 제약 조건 또는 조회 테이블에 따라 가장 작습니다.


4
'해당 사항 없음'에 대해 9로 건너 뛰는 이유는 무엇입니까? 3-8은 어때요?
— Kenmore

4
이것은 섹스입니다. OP는 구체적으로 성별을 요구했습니다. 성별과 성별은 서로 다른 가능한 값을 가질 수 있습니다.
— indigochild

2
@indigochild OP는 질문 제목에 두 단어를 모두 사용하며 적어도 그의 유스 케이스 (YMMV) 와 동등한 것으로 간주합니다 . 내 요점은 단순히이 영역에 ISO 표준이 존재한다는 것이며, 공식 표준이 존재할 때 자신 만의 방식을 고안하는 데 시간을 낭비해서는 안된다는 것입니다. 물론 해당 표준이 특정 사례를 다루지 않는 한, 전적으로 가능합니다.
— Pondlife

1
이것이 정답입니다. 최적화 (상황에 따라) 대신 데이터 무결성 (~ 영구)에 중점을 둡니다.
— Paul Cantrell

1
이것은 분명히 답이되어야합니다. 이 ISO 섹스 (생물학적 성)이 아닌 성별에 사용되는 @PeterCordes (당신이 무엇을 의미하는지) - 여기의 설명 . 나는 성별을 저장하고 싶을 때 (어떤 용도를 사용했는지 알지 못할 것입니다), 255 미만의 성별을 저장하려는 한 작은 int는 여전히 충분합니다 (fe 0 = 알려지지 않음 / 선언하고 싶지 않음, 1 = 남자, 2 = 여자, 3 = 남자로 식별하는 남자 등)
— SolidTerre

43

의학에는 남성, 여성, 불확실, 미지의 4 가지 성별이 있습니다. 4 개가 모두 필요하지는 않지만 확실히 1, 2 및 4가 필요합니다.이 데이터 유형의 기본값을 갖는 것은 적절하지 않습니다. 'is'및 'is n't'상태의 부울로 취급하는 것이 훨씬 적습니다.


1
@EJP, 흥미 롭습니다. 이것에 대한 언급이 있습니까?
— Marko

11
나의 아버지, MD BS FRACP.
— Lorne의 후작

이 정보를 바탕으로, 나는 TinyIntHugo가 제안한 것처럼 열거 형 과 정렬하고 적어도 1, 2 및 3 (기타)으로 갈 것입니다.
— IAbstract

1
@ EJP, 당신의 대답은 아마 맞지만, 사용해야하는 데이터 유형이 아니라 (기술적으로) 올바른 성별이 무엇인지 말하지 않습니다.
— Marko

17
영국 NHS (National Health Service) 데이터 사전 은 ISO 5218 값 을 무시하는 0 = Not Known, 1 = Male, 2 = Female, 9 =의 네 가지 값을 정의 합니다. 등록시 성별 (보통 출생 직후)과 현재의 두 가지 유형 이 있습니다 . Not Specified
— 1

3

에 정렬 된 Int(또는 TinyInt)Enum 필드 내 방법이 될 것입니다.

첫째, bit데이터베이스에 단일 필드가있는 경우 행은 여전히 ​​전체 바이트를 사용하므로 공간을 절약하는 한 여러 바이트가있는 경우에만 지불합니다bit 필드 .

둘째, 문자열 / 문자는 디자인 타임에 눈에 띄는 것과 상관없이 "마법의 가치"느낌을줍니다. 말할 것도없이, 사람들은 반드시 명백한 것에 매핑 할 필요가없는 거의 모든 가치를 저장할 수 있습니다.

셋째, 숫자 값은 참조 무결성을 강화하기 위해 조회 테이블을 작성하는 것이 훨씬 더 쉽고 더 나은 방법이며, 일대일을 열거 형과 상관시킬 수 있으므로 값을 메모리에 저장하는 데 패리티가 있습니다. 응용 프로그램 또는 데이터베이스에서.


2

나는 이름, 음성 및 대화에서 성별을 추측하고 때로는 성별을 알지 못하기 때문에 char 'f', 'm'및 'u'를 사용합니다. 최종 결정은 그들의 의견입니다.

그것은 당신이 그 사람을 얼마나 잘 알고 있는지 그리고 당신의 기준이 신체적 형태인지 개인적 정체성인지에 달려 있습니다. 심리학자는 여성 간, 남성 간, 여성 간, 남성 간, 자웅 동체 및 미정의 추가 옵션이 필요할 수 있습니다. 단일 문자로 명확하게 정의되지 않은 9 가지 옵션을 사용하면 Hugo의 작은 정수에 대한 조언을 사용할 수 있습니다.


주제가 아닙니다. 답이 아닙니다.
— hod

1

옵션 3이 가장 좋은 방법이지만 모든 DB 엔진에 "비트"유형이있는 것은 아닙니다. 비트가 없다면 TinyINT가 최선의 방법입니다.


-5
CREATE TABLE Admission (
    Rno INT PRIMARY KEY AUTO_INCREMENT,
    Name VARCHAR(25) NOT NULL,
    Gender ENUM('M','F'),
    Boolean_Valu boolean,
    Dob Date,
    Fees numeric(7,2) NOT NULL
);




insert into Admission (Name,Gender,Boolean_Valu,Dob,Fees)values('Raj','M',true,'1990-07-12',50000);
insert into Admission (Name,Gender,Boolean_Valu,Dob,Fees)values('Rani','F',false,'1994-05-10',15000);
select * from admission;

여기에 링크 설명을 입력하십시오


-5

옵션 3을 사용하지만 하나 대신 여러 개의 NON NULLABLE 비트 열을 사용합니다. IsMale (1 = 예 / 0 = 아니오) IsFemale (1 = 예 / 0 = 아니오)

필요한 경우 : IsUnknownGender (1 = 예 / 0 = 아니오) 등 ...

따라서 정의를 쉽게 읽을 수 있고, 확장 성, 프로그래밍이 쉬우 며, 도메인 외부의 값을 사용할 가능성이 없으며 값을 잠그기 위해 두 번째 조회 테이블 + FK 또는 CHECK 제약 조건이 필요하지 않습니다.

편집 : 수정, 설정 플래그가 유효한지 확인하려면 하나 이상의 제약 조건이 필요합니다.


내 답변이 다운 보트되는 이유를 듣는 것이 좋을까요?
— HansLindgren

제약 조건이 없으면 모든 열이 1이되거나 모든 열이 0이되는 것을 막을 수있는 것은 없습니다. 이는 무의미하므로 스키마가 귀하의 주장 중 하나를 충족시키지 못합니다.
— Jay Kominek

예, 올바른 수의 플래그가 '확인'되었는지 확인하려면 하나의 제약 조건이 필요합니다. 나는 모든 다운 투표가 그 누락에 대한 것이라고 생각하지 않습니다 ...
— HansLindgren

그것은 많이 방문한 질문 (다른 답변에 대한 upvotes를보십시오!)이며, 몇 년 후 와서 널리 알려진 기술 인 one-hot encoding에 해당하는 답변을 추가했습니다. 몇 가지 구체적인 속성이 있습니다. 나는 당신을 0 이하로 투표하는 것이 옳다고 생각하지 않지만, 그것이 또한 일어난다는 것에 놀라지 않습니다.
— Jay Kominek
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.