Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como gerenciar unidades de medida em um aplicativo da web PHP?


A explicação do problema é um pouco vaga e não tenho certeza do escopo do aplicativo, mas do ponto de vista da arquitetura do sistema, se você estiver usando um framework MVC, provavelmente desejará manter todas as suas unidades de banco de dados mesmo e crie um controlador UnitConversion. Este Controlador tomaria a unidade padrão como entrada e emitiria um valor baseado na unidade desejada. Um sinalizador seria mantido em seu registro de usuário/cliente no banco de dados para que você saiba qual Unidade eles preferem para que você não perca essas informações entre os logins. Passe o valor em um formato de unidade padrão (digamos, metros) e a bandeira da unidade desejada (digamos, 'FEET') em seu Controller e deixe-o fazer a conversão e retornar um valor.

Eu não tentaria manter diferentes tipos de unidades no banco de dados, pois você provavelmente acabará escrevendo todos os tipos de código tentando gerenciar as exceções e a manutenção (atualizando todos os valores quando os clientes alteram suas unidades, por exemplo). Mantenha uma unidade padrão no banco de dados e faça as conversões através de uma classe php semelhante a como o Zend Framework mencionado por Robert faz. Pesquisando no Google "conversão de unidade php" trará algumas classes que podem atender às suas necessidades.

EM ATUALIZAÇÃO:

Ainda não tenho certeza se estou vendo todo o problema, mas vou tentar responder da melhor forma que eu entendo. Como antes, é melhor manter 1 sistema de unidade no banco de dados, digamos, métrico. O tipo de medição em user_pref diz o que o cliente quer, digamos 'IMPERIAL'. Dependendo de como seu banco de dados está espalhado, você pode escolher uma das duas soluções para armazenar valores:

  1. Para itens em seu banco de dados, você pode ter diferentes propriedades (colunas), como peso, altura, volume, etc.

  2. Você pode ter uma tabela de itens que contém itens. Então você tem uma tabela de propriedades que contém propriedades. A tabela Property tem 4 colunas:property_id(chave primária), property(HEIGHT, WIDTH, LENGTH, WEIGHT), property_type(SIZE,MASS,VOLUME,AWESOMENESS) e value. Então você tem uma tabela Property_Lookup que tem 2 colunas:item_id, property_id e uma junção entre essas 3 tabelas lhe dará todos os valores e tipos de unidade de cada propriedade pertencente a um Item. Nesse esquema, eu ainda manteria todas as entradas na coluna 'valor' em um único sistema de unidade (neste exemplo de métrica). Veja este link para saber mais sobre relacionamentos muitos para muitos (http://www.tomjewett.com/dbdesign/dbdesign.php?page=manymany.php ).

Seus modelos irão recuperar dados e encapsular essas propriedades em uma unidade { system(METRIC*,IMPERIAL,BOTH); tipo(TAMANHO,MASSA,VOLUME); valor } minimodelo. Passe isso para o seu Controller. Ao renderizar sua View irá esperar um valor unitário baseado no que o cliente quer, então quando seu Controller estiver juntando dados para sua View ele enviará objetos Unit através da Biblioteca UnitConversion. A Biblioteca UnitConversion irá verificar o User Model para o sistema preferido do cliente e o 'system' no modelo Unit e fará a conversão necessária (já que a Biblioteca pode assumir que o sistema no modelo Unit é métrico ao vir do banco de dados, ela faz isso passo um pouco mais fácil). Ele então exibirá um número na unidade correta (unidades se AMBOS forem escolhidos), que pode ser passado para a Visualização.

Uma palavra rápida sobre o que foi dito acima é que sempre ao lidar com arquitetura de sistema não há solução 'correta' para um problema. É assim que eu organizaria as coisas com base nas informações fornecidas, mas você provavelmente precisará ajustá-las um pouco para que se encaixem perfeitamente com o que você está trabalhando. Dito isto, eu ajustaria o acima para funcionar em seu sistema, e não ajustaria seu sistema para fazer o acima funcionar! Espero que isso lhe dê algumas boas idéias.