sql >> Databasteknik >  >> RDS >> Oracle

DB Design för att lagra anpassade fält för en tabell

Detta är ett vanligt problem och det finns ingen perfekt lösning. Ett par lösningar:

1. Definiera X-fält av typen varchar2, Y-fält med typnummer och Z-fält av typdatum. Det kommer ut som potentiellt 3 gånger antalet anpassade fält men du kommer aldrig att ha några konverteringsproblem längre.

Ditt exempel skulle komma ut så här:

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

I ditt exempel har du samma antal numeriska värden och teckenvärden på båda raderna men det behöver inte vara så här:den tredje raden kan till exempel inte ha något numeriskt fält.

2. Definiera X-fält av typen varchar2 och använd en bijektiv funktion för att lagra nummer eller datumfält (till exempel kan Datum lagras som YYYYMMDDHH24miss ). Du behöver också ett extra fält som definierar radens kontext. Du skulle använda to_number eller to_char fungerar endast när raderna är av bra typ.

Ditt exempel:

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

Du kan fråga tabellen med DECODE eller CASE:

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

Den andra designen är den som används i Oracle Financials ERP (bland annat). Kontexten låter dig definiera CHECK-begränsningar med denna design (till exempel CHECK (CASE WHEN context = 'TYPE A' THEN to_number(field3) > 0 ) för att säkerställa integritet.



  1. Hur man får tag på Amazon MySQL RDS-certifikat

  2. java.lang.ClassCastException:oracle.sql.TIMESTAMP kan inte castas till java.sql.Timestamp

  3. Oracle-anslutningssträng utan tnsnames.ora-fil

  4. SQL - vänsterkoppling med OR-operator (MySQL)