2009-06-24 12 views
1

Ich entwerfe eine neue Labordatenbank. Ich möchte alle rohen Ergebnisse (für alle Tests) in einer Tabelle (RESULTS). Die numerischen Werte variieren jedoch stark in Menge und Präzision. Zum Beispiel sind einige Ergebnisse einfach eine ganze Zahl, während andere Ergebnisse von hochempfindlichen Geräten stammen.General Oracle Ergebnisse Tabelle

Welcher Fall unten ist ideal (und warum)?

Option 1: Speichern Sie jedes Ergebnis in einer raw_result Spalte als NUMMER mit der höchstmöglichen Genauigkeit.

ODER

Option 2: Erstellen Sie die RESULTS Tisch und mehrere Child-Tabellen die jeweils Ergebnisse eines ähnlichen Datentyp und eine raw_result Spalte als Zahl mit einer bestimmten Präzision für diesen Typ. (dh: Ganzzahl von 1 bis 1000, Dezimalzahl bis 6 Dezimalstellen, usw.)

In einem verwandten Beitrag General Oracle Data Collection Storage fragte ich nach dem idealen Weg, Rohsignale in dieser Datenbank zu speichern.

+0

Meiner eigenen Meinung nach wäre Option 1 viel einfacher zu implementieren und zu warten, aber ich würde eine Menge Effizienz beim Speichern kleiner Zahlen in einem großen Datentyp verlieren. – Steven

Antwort

3

Verwenden Sie die Option 1. Eine NUMBER ist intern eine NUMBER für Oracle, unabhängig von der Genauigkeit und Skalierung.

Option 2 scheint von Anfang an ein schrecklicher Wartungsalarm zu sein, und was tun Sie, wenn Sie sich dazu entschließen, die Genauigkeit eines Ihrer Werte zu ändern?

EDIT: zu veranschaulichen, betrachten:

SQL> CREATE TABLE testing (n1 NUMBER(38,12), n2 NUMBER(5)); 

    Table created 
    SQL> INSERT INTO testing VALUES (1, 1); 

    1 row inserted 
    SQL> INSERT INTO testing VALUES (990, 9900); 

    1 row inserted 
    SQL> INSERT INTO testing VALUES (1999999.999999, 1); 

    1 row inserted 
    SQL> SELECT n1, DUMP(n1) n1d, n2, DUMP(n2) n2d FROM testing; 

        N1 N1D        N2 N2D 
--------------------- ------------------------------ ------ -------------------- 
     1.000000000000 Typ=2 Len=2: 193,2     1 Typ=2 Len=2: 193,2 
    990.000000000000 Typ=2 Len=3: 194,10,91   9900 Typ=2 Len=2: 194,100 
1999999.999999000000 Typ=2 Len=8: 196,2,100,100,100  1 Typ=2 Len=2: 193,2 
         ,100,100,100       
    SQL> 

Kein Unterschied in der Lagerung. Die gespeicherte Länge ist datenabhängig, nicht die Genauigkeit/Skalierung der Spaltendefinition.

This link gibt eine ziemlich gute Erklärung, wie der NUMBER-Typ gespeichert ist. Es ist nicht so einfach, die Werte zu vergleichen, um eine Vorstellung davon zu erhalten, wie viel Speicherplatz für eine bestimmte Zahl benötigt wird. Zum Beispiel dauert es 3 Bytes, um die Zahl 990 zu speichern, aber nur 2 Bytes, um 9900 zu speichern.

+0

Korrekt, mit einer Anmerkung, Sie können nur eine bestimmte Anzahl von Bytes haben, so dass unterschiedliche Präzision und Skalen für verschiedene Zahlen benötigt werden. –

+0

Ich bin mir nicht sicher, was dein Punkt hier ist. Wenn Sie davon sprechen, zu viel Präzision zu verbieten, ist das eine Sache - Oracle kann das mit NUMBER (p, s) -Definitionen durchsetzen. Aber das alles benötigt die gleiche Menge an Speicherplatz. – DCookie

+0

Meine Schuld, ich dachte, wenn Sie eine Skala von sagen 5 setzen, würde es immer die 5 Bytes nehmen, selbst wenn Sie es eine ganze Zahl gaben. Jetzt, wo ich darüber nachdenke, glaube ich nicht, dass das der Fall ist. –

1

Ich würde sagen, es hängt davon ab, wie Sie die Daten später verwenden werden. Option 1 ist anfangs einfacher einzurichten, aber wenn Sie später immer versuchen, die Daten für die Verarbeitung/Anzeige usw. zu trennen, ist Option 2 auf lange Sicht möglicherweise einfacher.

DCookie hat einen guten Job gemacht und erklärt, dass Option 2 keine technischen Vorteile für die Speicherung hat. Es läuft also darauf hinaus, mit welcher Verarbeitung Sie auch arbeiten.

Ich möchte alle rohen Ergebnisse (für alle Tests) in einer Tabelle (RESULTS).

Wenn Sie das Gefühl haben, dass es am sinnvollsten ist, alles in eine Tabelle zu schreiben, dann tun Sie das.