Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

DB Design para armazenar campos personalizados para uma tabela


Este é um problema comum e não existe uma solução perfeita. Algumas soluções:

1. Defina campos X do tipo varchar2, campos Y do tipo número e campos Z do tipo data. Isso é potencialmente 3 vezes o número de campos personalizados, mas você nunca mais terá nenhum problema de conversão.

Seu exemplo ficaria assim:
Id Name field_char1  field2_char2 field_char3 ... field_num1 field_num2 ...
1  lap1 lappy        lappy        lappy       ... 12         13     
2  lap2 lappy2       lappy2       lapp2       ... 13         12

No seu exemplo, você tem o mesmo número de valores numéricos e valores de caracteres em ambas as linhas, mas não precisa ser assim:a terceira linha pode não ter campo numérico, por exemplo.

2. Defina campos X do tipo varchar2 e aplique uma função bijetiva para armazenar o campo de número ou data (por exemplo, a data pode ser armazenada como YYYYMMDDHH24miss ). Você também precisará de um campo extra que definirá o contexto da linha. Você aplicaria o to_number ou to_char funcionam somente quando as linhas são do tipo bom.

Seu exemplo:
Id Name context field1  field2 field3  field4 field5
1  lap1 type A  lappy   lappy  12      13     lappy
2  lap2 type B  lappy2  13     lappy2  lapp2  12

Você pode consultar a tabela usando DECODE ou CASE:
SELECT * 
  FROM laptop
 WHERE CASE WHEN context = 'TYPE A' THEN to_number(field3) END = 12

O segundo design é o utilizado no ERP Oracle Financials (entre outros). O contexto permite-lhe definir restrições CHECK com este design (por exemplo CHECK (CASE WHEN context = 'TYPE A' THEN to_number(field3) > 0 ) para garantir a integridade.