Armazenando sexo (sexo) no banco de dados

130

Quero armazenar o sexo de um usuário em um banco de dados com o menor custo possível (tamanho / desempenho).

Até agora, três cenários vêm à mente

  1. Int - alinhado com Enum no código (1 = Masculino, 2 = Feminino, 3 = ...)
  2. char (1) - armazena m , f ou outro identificador de caractere único
  3. Bit (booleano) - existe um nome de campo apropriado para esta opção?

A razão pela qual pergunto é por causa dessa resposta, que menciona que caracteres são menores que booleanos .

Devo esclarecer que eu estou usando o MS SQL 2008, que FAZ , de facto, o tipo de dados bit.

Marko
fonte
1
FWIW, essa pergunta SO mencionada se refere a como o .NET representa esses tipos na memória. Não tem nada a ver com a forma como o SQL Server os representa. bit <= char. msdn.microsoft.com/en-us/library/ms177603.aspx
Matt
1
Para que você está usando o campo de gênero? Poderia ser apenas uma string, para que as pessoas possam inserir o que gostam? Tentar enumerar todas as respostas possíveis para essa pergunta será complicado.
shogged
@ ThePassenger: Eu acho que a opção usual é basicamente m / f / outro, então sim, ternário, como você sugere, está bem. Você pode distinguir "outro" de "não especificado" (como em "Não estou dizendo" e / ou "ainda não perguntamos ao usuário"). Não conheço pessoas fluentes em gênero que desejam um valor de ponto flutuante com um controle deslizante que eles podem definir todos os dias; meu palpite é que a maioria deles (e outras pessoas que não são do gênero tradicional) ficaria feliz em escolher "outro" ou "não especificado" em quase qualquer site. Mas não, acho que pedir "sexo" em vez de "gênero" seria uma boa ideia.
22618 Peter Cordes
1
@ PeterCordes Não conheço bem o gênero "fluido", na minha aldeia você é um homem, uma mulher ... ou uma vaca. Se o gênero agora é fluido, criar uma escala de valor quanto ao som do computador parece pedir demais. No meu país, preferimos pedir sexo, é menos complicado. Oh, não acredite que estamos na Idade da Pedra até agora, hein! Já descobrimos Deus e somos monoteístas desde a última colonização.
Revolucion para Monica
2
@ PeterCordes: como exigir essas coisas no clima político atual dará vantagens às pessoas, fornecendo-lhes domínio sobre as outras, assim que você incluir um controle deslizante de valor flutuante, alguém avançará exigindo um controle multidimensional. "Apenas um controle deslizante? Você está na idade da pedra?"
vsz 21/08/19

Respostas:

82

Eu chamaria a coluna "gênero".

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

O tipo de dados BIT pode ser descartado porque suporta apenas dois sexos possíveis, o que é inadequado. Enquanto o INT suporta mais de duas opções, são necessários 4 bytes - o desempenho será melhor com um tipo de dados menor / mais estreito.

CHAR(1)tem vantagem sobre o TinyINT - ambos têm o mesmo número de bytes, mas CHAR fornece um número mais restrito de valores. O uso CHAR(1)tornaria o uso de "m", "f" etc. chaves naturais, versus o uso de dados numéricos que são chamados de chaves substitutas / artificiais. CHAR(1)também é suportado em qualquer banco de dados, caso seja necessário portar.

Conclusão

Eu usaria a opção 2: CHAR (1).

Termo aditivo

Um índice na coluna de gênero provavelmente não ajudaria porque não há valor em um índice em uma coluna de baixa cardinalidade. Ou seja, não há variedade suficiente nos valores para o índice fornecer qualquer valor.

Pôneis OMG
fonte
Alguma referência ao desempenho? Eu sei que é quase micro-otimizador, o que não devo fazer, mas é um alimento para minha mente curiosa.
Marko
Obrigado @OMG Ponies, e o desempenho? Um char seria mais caro do que um pouco nesse caso?
Marko
4
@ Marko: Como eu disse antes, eles são iguais. Mas um índice provavelmente não ajudaria porque não há valor em um índice em uma coluna de baixa cardinalidade. Ou seja, não há variedade suficiente nos valores para o índice fornecer qualquer valor.
OMG Ponies
1
Quanto melhor o desempenho realmente estará usando, digamos, um tipo de dados de 4 bytes em uma plataforma de 64 bits? Basta dizer ... ;-)
Craig
1
Eu ficaria com pouco, pois há apenas dois sexos. No entanto, a questão inicial do OP permanece: qual seria o nome da coluna? "IsMale" ou "IsFemale" é um pouco estranho ...
Mateus Felipe
180

Já existe um padrão ISO para isso; não há necessidade de inventar seu próprio esquema:

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

De acordo com o padrão, a coluna deve ser chamada "Sexo" e o tipo de dados 'mais próximo' seria tinyint com uma restrição CHECK ou tabela de pesquisa, conforme apropriado.

Pondlife
fonte
4
Por que pula para 9 por 'não aplicável'? Que tal 3-8?
Kenmore
4
Isto é para sexo. O OP solicitou especificamente o gênero. Sexo e gênero provavelmente têm diferentes valores possíveis que podem precisar ser capturados.
Indigochild 15/10
2
@indigochild O OP usa as duas palavras no título da pergunta e as considera claramente equivalentes, pelo menos no caso de uso (YMMV). Meu argumento é simplesmente que existe um padrão ISO nessa área e você nunca deve perder tempo planejando seu próprio esquema quando existe um padrão oficial. A menos, é claro, que esse padrão não cubra seu caso específico, o que é inteiramente possível.
19615 Pondlife
1
Essa deve ser a resposta aceita. Ele se concentra na integridade dos dados (que é ~ para sempre) em vez da otimização (que é situacional).
Paul Cantrell
1
Definitivamente, essa deve ser a resposta. @ PeterCordes, esta ISO é usada para Sexo (sexo biológico) e não para Gênero (o que você identifica como) - explicação aqui . Eu acho que, no caso de querer armazenar o gênero (que, eu não saberia qual uso você usa), um pequeno int ainda é bom o suficiente, desde que você queira armazenar menos de 255 gêneros (dizendo fe 0 = desconhecido / não querendo declarar, 1 = homem, 2 = mulher, 3 = homem que se identifica como mulher, etc.)
SolidTerre
43

Na medicina, existem quatro gêneros: masculino, feminino, indeterminado e desconhecido. Talvez você não precise dos quatro, mas certamente precisa de 1, 2 e 4. Não é apropriado ter um valor padrão para esse tipo de dados. Ainda menos para tratá-lo como um booleano com os estados 'is' e 'is'.

Marquês de Lorne
fonte
1
@EJP, interessante. Você tem uma referência a isso?
Marko
11
Meu pai, MD BS FRACP.
Marquês de Lorne
Com base nessas informações, eu TinyIntalinharia com um enum (como Hugo sugere) e com pelo menos 1, 2 e 3 (Outros).
iAbstract
1
@EJP, embora sua resposta provavelmente esteja correta, NÃO diz que tipo de dados devo usar, mas sim - quais são os gêneros (tecnicamente) corretos.
Marko
17
O dicionário de dados do Serviço Nacional de Saúde do Reino Unido (NHS) define quatro valores: 0 = Not Known, 1 = Male, 2 = Female, 9 = Not Specified, que refletem os valores da ISO 5218 . Observe que existem dois tipos : gênero no registro (geralmente logo após o nascimento) e atual.
precisa saber é o seguinte
3

Um Int(ou TinyInt) alinhado a um Enumcampo seria minha metodologia.

Primeiro, se você tiver um único bitcampo em um banco de dados, a linha ainda usará um byte completo; portanto, quanto à economia de espaço, só compensa se você tiver vários bitcampos.

Segundo, strings / caracteres têm um "valor mágico", independentemente de quão óbvios possam parecer no momento do design. Sem mencionar, ele permite que as pessoas armazenem praticamente qualquer valor que não necessariamente mapeariam para algo óbvio.

Terceiro, um valor numérico é muito mais fácil (e melhor prática) para criar uma tabela de pesquisa, a fim de reforçar a integridade referencial e pode correlacionar 1 a 1 com uma enumeração, para que haja paridade no armazenamento do valor na memória dentro o aplicativo ou no banco de dados.

Hugo
fonte
2

Uso char 'f', 'm' e 'u' porque suponho que o gênero seja do nome, da voz e da conversa e, às vezes, não conheço o gênero. A determinação final é a opinião deles.

Realmente depende de quão bem você conhece a pessoa e se seus critérios são de forma física ou identidade pessoal. Um psicólogo pode precisar de opções adicionais - passagem para mulher, passagem para homem, passagem para mulher, passagem para homem, hermafrodita e indecisa. Com 9 opções, não claramente definidas por um único caractere, posso seguir o conselho de Hugo de número inteiro minúsculo.

zarac
fonte
Não no tópico. Não é uma resposta.
hod
1

A opção 3 é sua melhor aposta, mas nem todos os mecanismos de banco de dados têm um tipo "bit". Se você não tem um pouco, então o TinyINT seria sua melhor aposta.

ajacian81
fonte
-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;

insira a descrição do link aqui

Mohammad Asif
fonte
-5

Eu iria com a opção 3, mas várias colunas de bits NÃO NULÁVEIS, em vez de uma. IsMale (1 = Sim / 0 = Não) IsFemale (1 = Sim / 0 = Não)

se solicitado: IsUnknownGender (1 = Sim / 0 = Não) e assim por diante ...

Isso facilita a leitura das definições, fácil extensibilidade, fácil programação, nenhuma possibilidade de usar valores fora do domínio e nenhum requisito de uma segunda tabela de pesquisa + restrições FK ou CHECK para bloquear os valores.

EDIT: Correção, você precisa de pelo menos uma restrição para garantir que os sinalizadores definidos sejam válidos.

HansLindgren
fonte
Seria bom saber por que minha resposta foi rebaixada?
21719 HansLindgren
Sem restrições, nada impede que todas as colunas sejam 1 ou todas elas sejam 0. O que seria absurdo, portanto, seu esquema não satisfaz uma de suas reivindicações.
Jay Kominek
Sim, você está certo de que precisa de uma restrição para verificar se o número correto de sinalizadores está 'marcado'. Eu não acho que todos os votos negativos são para essa omissão, no entanto ...
HansLindgren
É uma pergunta muito visitada (veja os upvotes de algumas das outras respostas!), E você apareceu anos depois e adicionou uma resposta que equivale a codificação one-hot, uma técnica amplamente ensinada, que nem sequer tem o poucas propriedades concretas que você atribui a ele. Eu não acho que foi certo votar em você abaixo de 0, mas também não estou surpreso que isso tenha acontecido.
Jay Kominek 13/07