sql >> Databáze >  >> RDS >> Oracle

Návrh DB pro ukládání vlastních polí pro tabulku

Toto je běžný problém a neexistuje dokonalé řešení. Několik řešení:

1. Definujte X polí typu varchar2, Y polí typu číslo a Z polí typu datum. To vychází jako potenciálně trojnásobek počtu vlastních polí, ale už nikdy nebudete mít žádný problém s převodem.

Váš příklad by vyšel takto:

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

Ve vašem příkladu máte na obou řádcích stejný počet číselných hodnot a hodnot znaků, ale nemusí to tak být:například třetí řádek nemůže obsahovat žádné číselné pole.

2. Definujte X polí typu varchar2 a použijte bijektivní funkci pro uložení pole čísla nebo data (například Datum může být uloženo jako YYYYMMDDHH24miss ). Budete také potřebovat další pole, které bude definovat kontext řádku. Aplikovali byste to_number nebo to_char fungovat pouze v případě, že jsou řádky typu dobrý.

Váš příklad:

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

Do tabulky můžete zadat dotaz pomocí DECODE nebo CASE:

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

Druhý návrh je ten, který se používá v Oracle Financials ERP (mimo jiné). Kontext vám umožňuje definovat omezení CHECK s tímto návrhem (například CHECK (CASE WHEN context = 'TYPE A' THEN to_number(field3) > 0 ), aby byla zajištěna integrita.



  1. vytváření spouštěčů napříč různými databázemi

  2. mysqli_affected_rows pro UPDATE někdy vrátí 0 při úplné shodě řádku

  3. Použití IF EXISTS s CTE

  4. Selhání migrace tapů ze sqlite na postgres rails4, ruby ​​1.9.3