INTRODUÇÃO E INFORMAÇÕES RELEVANTES:
Digamos que eu tenha uma tabela que armazene a altura e o peso de uma pessoa, mais ou menos assim:
PersonTable < # ID int, Name varchar(50), Height double, Weight double >
A altura é medida em centímetros e o peso em quilogramas.
PROBLEMA:
Meu problema é armazenar unidade de medida para altura e peso.
MEUS ESFORÇOS PARA RESOLVER ISSO:
PersonTable < # ID int,
Name varchar(50),
Height double, $ HeightUnit_Id int,
Weight double, $ WeightUnit_Id int >
Units < #ID int, Desription varchar(20) >
HeightUnit_Id e WeightUnit_Id são chaves estrangeiras que fazem referência ao Id da tabela Units.
PERGUNTA:
Existe uma solução melhor do que as óbvias que mencionei acima, já que não gosto de ambas (o EAV pode ficar confuso se for mal feito e adicionar "colunas de unidade" extras parece um desperdício de espaço para mim)?
Assumindo que os tipos de medição não serão misturados (ou seja, nenhuma linha específica não irá misturar "kg" e "polegadas" OU "libras" e "cm"), e também assumindo que pelo menos parte da intenção desta Questão está relacionada a isso agora Pergunta relacionada excluída ( observe que o link a seguir não funcionará, a menos que você tenha pontos rep suficientes para ver os itens excluídos: Lidando com atributos compostos com parte constante ), então você só precisa indicar o sistema de medição usado por essa linha. Neste modelo, você teria uma única
MeasurementSystem
tabela com chave estrangeira para quaisquer tabelas contendo medições. Por exemplo (usando a sintaxe do Microsoft SQL Server):Se você estiver misturando sistemas de medição e/ou se estiver permitindo várias unidades de medição, mesmo se confinado a um sistema (ou seja, permitindo "mm", "cm", "m"), será necessário haver um camada adicional para lidar com o aumento da granularidade, incluindo a necessidade de ter um campo FK para cada coluna de medida na
Person
tabela. (Posso adaptar o modelo acima para se adequar a isso, mas aguardarei alguns esclarecimentos antes de fazê-lo).Ou, se houver uma quantidade razoavelmente finita/limitada de combinações de várias unidades de peso e unidades de altura, você pode usar cada linha para representar uma das combinações aceitas (por exemplo, "cm & kg", "m & kg", "mm & kg" / "pol e lb", "pé e lb"). E então "US" vs "Metric" é apenas uma propriedade de cada linha da tabela de pesquisa. Por exemplo:
Ou, se houver necessidade de combinações de Unidades que cruzam diferentes sistemas de medição, eu usaria tabelas separadas -- uma para cada tipo de medição: "WeightUnits" e "HeightUnits". Eu não misturaria unidades para alturas e pesos na mesma tabela (ou seja, "kg" e "cm" em linhas diferentes). Por exemplo:
Neste modelo, cada tipo de medição em qualquer tabela possui seu próprio FK pessoal para sua tabela de pesquisa de unidades de medição.
Vendo como esta questão é em relação ao design, as respostas provavelmente serão bastante opinativas...
Aqui está a minha opinião sobre como ele deve ser projetado. ;)
Tabela para armazenar unidades de medida
Sua mesa pessoal...
E então uma tabela de conversão
Se uma unidade de medida não tiver uma entrada na tabela de conversão de medida para outro tipo específico de unidade, não haverá conversão direta disponível. (Por exemplo, cm -> polegadas funcionaria, mas cm -> horas não...) Deve ser fácil exibir suas medidas em diferentes unidades.
Sua unidade de medida pode ser qualquer coisa que você quiser (distância/tempo/etc)... mas você pode querer adicionar um tipo de medida... não tenho certeza se me preocuparia com isso - depende do caso de uso.
Se suas unidades de medida de altura/peso forem realmente fixas , ou seja, altura=CMs, Peso=KGs, eu não introduziria nenhuma coluna adicional (ou lógica) para especificar a unidade de medida. Em vez disso, o que eu faria é apenas alterar o nome da coluna, como
Dessa forma, posso remover qualquer confusão sobre a unidade de medida para as colunas Altura e Peso.
Depende do que você está projetando... um sistema OLTP normalizado teria uma tabela de medidas separada (ou algum nome semelhante) que fornece integridade referencial e otimizações de desempenho para cada unidade de medida possível.
Se você estiver fazendo análises e lidar com unidades com pouca frequência e fizer menos conversões, isso pode ser armazenado como um atributo. Isso ainda seria raro - algo como respostas a pesquisas ou um padrão da indústria como metragem quadrada para imóveis. Mas o que mais é medido e faz sentido no mercado imobiliário? planos de chão? Agora temos polegadas... e quadrados e cúbicos. Voltamos a um design normalizado.
Para altura, uma variedade de medidas são aplicáveis e fazem todo o sentido em vários contextos. Provavelmente uma boa ideia usar um design como este:
Com esse design, você pode criar facilmente uma tabela de pesquisa/conversão agora: