Oracle
 sql >> Base de données >  >> RDS >> Oracle

DB Design pour stocker des champs personnalisés pour une table

C'est un problème courant et il n'y a pas de solution parfaite. Quelques solutions :

1. Définissez les champs X de type varchar2, les champs Y de type nombre et les champs Z de type date. Cela représente potentiellement 3 fois le nombre de champs personnalisés, mais vous n'aurez plus jamais de problème de conversion.

Votre exemple ressemblerait à ceci :

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

Dans votre exemple, vous avez le même nombre de valeurs numériques et de valeurs de caractères sur les deux lignes, mais il n'est pas nécessaire qu'il en soit ainsi :la troisième ligne peut ne pas avoir de champ numérique par exemple.

2. Définissez les champs X de type varchar2 et appliquez une fonction bijective pour stocker le champ de nombre ou de date (par exemple, la date peut être stockée sous la forme YYYYMMDDHH24miss ). Vous aurez également besoin d'un champ supplémentaire qui définira le contexte de la ligne. Vous appliqueriez le to_number ou to_char fonctionnent uniquement lorsque les lignes sont du bon type.

Votre exemple :

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

Vous pouvez interroger la table en utilisant DECODE ou CASE :

SELECT * 
  FROM laptop
 WHERE CASE WHEN context = 'TYPE A' THEN to_number(field3) END = 12

La deuxième conception est celle utilisée dans l'ERP Oracle Financials (entre autres). Le contexte permet de définir des contraintes CHECK avec ce design (par exemple CHECK (CASE WHEN context = 'TYPE A' THEN to_number(field3) > 0 ) pour garantir l'intégrité.