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


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.