Oracle
 sql >> Database >  >> RDS >> Oracle

DB Design per memorizzare campi personalizzati per una tabella

Questo è un problema comune e non esiste una soluzione perfetta. Un paio di soluzioni:

1. Definire X campi di tipo varchar2, Y campi di tipo numero e Z campi di tipo data. Questo risulta essere potenzialmente 3 volte il numero di campi personalizzati, ma non avrai più problemi di conversione.

Il tuo esempio verrebbe così:

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

Nel tuo esempio hai lo stesso numero di valori numerici e valori di caratteri su entrambe le righe, ma non deve essere così:la terza riga potrebbe non avere un campo numerico, ad esempio.

2. Definisci X campi di tipo varchar2 e applica una funzione biiettiva per memorizzare il campo numero o data (ad esempio la data potrebbe essere memorizzata come YYYYMMDDHH24miss ). Avrai anche bisogno di un campo aggiuntivo che definirà il contesto della riga. Dovresti applicare il to_number o to_char funzionano solo quando le righe sono di tipo buono.

Il tuo esempio:

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

Puoi interrogare la tabella usando DECODE o CASE:

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

Il secondo design è quello utilizzato in Oracle Financials ERP (tra gli altri). Il contesto consente di definire i vincoli CHECK con questo progetto (ad esempio CHECK (CASE WHEN context = 'TYPE A' THEN to_number(field3) > 0 ) per garantire l'integrità.