Announcement

Collapse
No announcement yet.

Richtige Struktur ODER maximale Anzahl der Spalten

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Richtige Struktur ODER maximale Anzahl der Spalten

    Sehr geehrte Forumbesucher,

    ich arbeite seit kurzer Zeit mit Oracle Datenbanken und muss in einer Tabelle eine große Menge Daten verwalten. Nur weiss ich nicht welche Struktur die Tabelle am besten haben soll.
    Zur Datenstruktur:
    es gibt ca. 2000 - 3000 Messgeräten, die jede Stunde einen Wert liefern. D.h. pro Jahr ca. 365 Tage x 24 Stunden = 8760 Werte pro Jahr.
    Innerhalb von einigen Jahren hat sich so eine Menge von Daten gesammelt.
    z.B. für 5 Jahre: 8760 Werte * 5 Jahre = 43800 Werte

    Jetzt stellt sich die Frage: wie soll ich diese Daten am besten in einer Datenbank speichern, damit ich später für belibiege Messgeräte und belibiege Zeiträume:
    - die Summe der Werte über mehrere Messgeräte für jede Stunde pro Tag, Jahr
    - Max/Min für jede Stunde im Tag
    schnell berechnen kann.

    Ich habe mir zwei Möglichkeiten überlegt:
    1) eine Tabelle mit 3 Spalten erstellen:
    ==================================
    TagStunde / Messgerät / Wert
    ==================================
    2005.02.01 01:00 0000001 0.5
    2005.02.01 02:00 0000001 0.7
    2005.02.01 03:00 0000001 0.6
    ....
    2009.08.01 23:00 0000001 -0.2
    2005.02.01 01:00 0000022 0.4
    2005.02.01 02:00 0000022 0.4
    2005.02.01 03:00 0000022 0.8
    ....
    2009.08.01 23:00 0000022 0.1

    und alle Werte in einer Spalte speicher, wobei man diese dann mit ID des Messgerätes und einem Zeitraum rausfiltern kann.
    - einen großen Nachteil (hat sich während der Arbeit herausgestellt)
    wenn einige Stationen Lücken bei den Werten haben (die Werte fehlen einfach), dann lässt sich die Summe über mehrere Stationen nur schwer bilden. Man muss für alle TagStunden (für 5 Jahre waren es 43800 Stk.) die Werte einzeln addieren.

    2)
    Man erstellt eine Tabelle mit vielen Spalten:
    - eine Spalte für TagStunde:
    - eine Spalte für jedes Messgerät. Als Name ID des Gerätes nehmen
    zB.
    - wenn einen Wert für eine Stunde fehlt, dann soll da "0" stehen.

    ================================================== ====
    TagStunde 0000001 0000022 0000005 0000123 ....
    ================================================== ====
    2005.02.01 01:00 0.5 0.1 0.4 0.2
    2005.02.01 02:00 0.7 -0.1 - 0.1 0.5
    2005.02.01 03:00 0.6 0.5 0.5 0.4
    ....
    2009.08.01 23:00 -0.2 0.2 0.1 0.3

    --> Insgesamt sind es für 3000 Messgeräte: 3001 Spalten in der Tabelle?
    FRAGE: Ist es überhaupt möglich in Oracle (Version 10g)????

    Die Vorteile dieser Version: Man kann die Summe für beliebige Messgeräte bilden, in dem man eine SQL-Abfrage macht: "SELECT spalte1+spalte2+... FROM Tabelle1";


    Hat jemand vielleicht schon eine Erfahrung mit gleichem Problem gemacht?
    Welche Struktur soll ich für die Tabelle am besten wählen? Gibt es vielleicht noch andere Möglichkeiten? Wieviel Spalten maximal darf eine Tabelle in Oracle haben? Sind die SQL-Abfragen bei solchen Tabellen (viele Spalten > 1000) performant?

    Freue mich auf Ihre Kritik und Hilfe!

  • #2
    Hi,

    den Vorschlag 2 hab ich gar nicht erst gelesen, denn der ist komplett falsch. Vorschlag 1 geht in die richtige Richtung. Du legst eine Tabelle für die Messgeräte an, in der Du nur die Geräteinformationen speicherst. Dann noch eine weitere Tabelle für die Messwerte. Die Tabellen sind über einen Foreign key Constraint miteinander verknüpft.

    wenn einige Stationen Lücken bei den Werten haben (die Werte fehlen einfach), dann lässt sich die Summe über mehrere Stationen nur schwer bilden. Man muss für alle TagStunden (für 5 Jahre waren es 43800 Stk.) die Werte einzeln addieren.
    Die Aussage versteh ich nicht ganz.

    Dim
    Zitat Tom Kyte:
    I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

    Comment


    • #3
      - einen großen Nachteil (hat sich während der Arbeit herausgestellt)
      wenn einige Stationen Lücken bei den Werten haben (die Werte fehlen einfach), dann lässt sich die Summe über mehrere Stationen nur schwer bilden. Man muss für alle TagStunden (für 5 Jahre waren es 43800 Stk.) die Werte einzeln addieren.
      Damit meine ich, dass die Daten, die Messgeräte liefern, nicht immer vollständig sind, d.h. aufgrund eines Ausfalls kann es dazu führen, dass die Werte für ein Gerät für einen bestimmten Zeitraum einfach fehlen.

      z.B. zwei Messgeräte 001 und 002 haben die Werte für 5 Jahre (43800 Werte), wobei Messgerät 001 innerhalb diesen 5 Jahren in der Summe 20 Tage defekt war und Messgerät in der Summe an anderen 15 Tagen defekt war.

      => Wenn ich jetzt für beide Geräte die Summe der Werte für alle Tage und Stunden bilden will, so dass ich für jeden Tag/jede Stunde einen Wert für beide Geräte habe:

      z.B. TagStunde______Gerät______Wert
      2008.07.04 01:00__001 ______0.2
      2008.07.04 01:00__002 ______0.1

      in der Summe für beide Geräte für 2008.07.04 01:00 => 0.3

      => so muss ich alle Werte in einer Schleife addieren,
      z.B. summe der Werte für den Zeitraum 2008.01.01 - 2008.12.31
      1) da einige Werte fehlen können, muss ich zuerst eine Liste mit allen TagStunden bilden:
      2008.01.01 00:00
      2008.01.01 01:00
      2008.01.01 02:00
      ...
      2008.12.31 22:00
      2008.12.31 23:00
      2) dann muss ich in einer Schleife für jeden Wert aus der DB, die entsprechende TagStunde suchen und dann den Wert dazuaddieren

      => Wenn man die Summe für 10 Messgeräte und 5 Jahre (43800 Werte) bilden will, dann soll man 10 mal eine Schleife mit <= 43800 Iterationen durchlaufen.
      Diese Lösung ist nicht performant und dauert sehr lange.


      ================================================== =
      zu Variante 2)
      wenn alle Werte für jedes Gerät in einer eigenen Spalte gespeichert sind und für fehlende Werte (per default) eine "0" steht, dann lässt sich dieses Problem theoretisch mit einer SQL-Abfrage lösen:
      SELECT gerät1+gerät2+...+gerät10 FROM tabelle1;

      => und dass soll viel schneller gehen als einen Durchlauf von 10 Schleifen je 43800 Iterationen.

      Comment


      • #4
        irgendwie ist das nicht verständlich:

        Es gibt Messgeräte die liefern keine Daten, weil sie defekt sind -> gut

        Dann gibt es halt in der DB keine Daten für diese Zeit. Was hindert einen nun daran das Summieren pro Gerät/per Stunde durch einen SQL machen zu lassen? Dann gibt es halt für defekte Geräte in bestimmten Stunden als Ergebnis 0. Und das ändert sich auch nicht, wenn mehrere Geräte summiert werden.
        Christian

        Comment


        • #5
          Wenn man die Summe für 10 Messgeräte und 5 Jahre (43800 Werte) bilden will, dann soll man 10 mal eine Schleife mit <= 43800 Iterationen durchlaufen.
          Diese Lösung ist nicht performant und dauert sehr lange.
          Wenn ich eine Summe berechnen möchte, dann verwende ich SQL und die SUM Funktion. Ist mit den paar Sätzen (43800 sind nicht wirklich viel für eine Datenbank) eine Sache von 2-3 Sekunden.

          Dim
          Zitat Tom Kyte:
          I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

          Comment


          • #6
            Originally posted by diman View Post
            Damit meine ich, dass die Daten, die Messgeräte liefern, nicht immer vollständig sind, d.h. aufgrund eines Ausfalls kann es dazu führen, dass die Werte für ein Gerät für einen bestimmten Zeitraum einfach fehlen.
            Hallo Diman,

            Es spielt in diesem Zusammenhang keine Rolle, ob du nicht komplette Datenreihen für deine Geräte hast, die Summierung / Gruppierung kannst du trotzdem machen, und zwar ohne weiteres in SQL. Dim hat dir einen Denkanstoss gegeben (1 Entität Messgeräte und 1 Messergebnisse), damit solltest du alle Aufgaben erledigen können.


            Gruss

            Comment


            • #7
              Was hindert einen nun daran das Summieren pro Gerät/per Stunde durch einen SQL machen zu lassen?
              Wie kann es durch einen SQL machen?

              Wenn ich folgende Tabelle "Tabelle1" habe:
              ==================================
              TagStunde | GerätID | Wert
              ==================================
              2009.01.01 01:00_________ 001 ______ 0.2
              2009.01.01 02:00_________ 001 ______ 0.3
              2009.01.01 03:00_________ 001 ______ -0.1
              ...
              2009.01.01 01:00_________ 002 ______ 0.4
              2009.01.01 02:00_________ 002 ______ 0.5
              2009.01.01 03:00_________ 002 ______ 0.1

              Soll ich dann für jede TagStunde eine SQL-Abfrage machen?
              z.B.
              SELECT SUM(Wert) FROM Tabelle1 WHERE TagStunde = '2009.01.01 01:00' AND (GerätID = 001 AND GerätID = 002)

              wenn ich Werte für den gesamten Zeitraum brauche, soll ich dann 43800 SQL-Abfragen in einer Schleife machen, um alle TagStunden abzufragen? Oder kann ich das auch mit SQL umgehen?

              Comment


              • #8
                AND (GerätID = 001 AND GerätID = 002)
                Die Bedingung ist schon mal falsch. Ein Feld kann nicht gleichzeitig den Wert 001 und 002 haben. Außerdem fehlen die ' ' um die Strings, aber egal.

                Dazu nutzt Du einfach die Gruppierungsfunktion:
                Code:
                select sum(wert),tagstunde from tabelle1 where geraetid in('001','002') group by tagstunde order by tagstunde
                Dim
                Zitat Tom Kyte:
                I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

                Comment


                • #9
                  Originally posted by diman View Post
                  ........soll ich dann 43800 SQL-Abfragen in einer Schleife machen, um alle TagStunden abzufragen? Oder kann ich das auch mit SQL umgehen?
                  hallo,


                  ich würde dir dringend zu folgender Lektüre raten :

                  http://download.oracle.com/docs/cd/B...b14200/toc.htm

                  Ansonsten hat dir Dim weiter oben ja schon die Lösung präsentiert.

                  Gruss

                  Comment


                  • #10
                    Ich würd eher mit sowas anfangen:

                    http://www.sql-und-xml.de/sql-tutorial/

                    Ne Referenz erschlägt einen, wenn man die Basics noch nicht verstanden hat. Denke hier muss erstmal Grundverständnis für SQL her bzw. für einige Aspekte von SQL

                    Comment


                    • #11
                      Originally posted by fanderlf View Post
                      Ich würd eher mit sowas anfangen:

                      http://www.sql-und-xml.de/sql-tutorial/

                      Ne Referenz erschlägt einen, wenn man die Basics noch nicht verstanden hat. Denke hier muss erstmal Grundverständnis für SQL her bzw. für einige Aspekte von SQL
                      ja, da magst du recht haben :-)


                      Gruss

                      Comment


                      • #12
                        Danke für die Hilfe!

                        Ich habe bisher SQL nur für einfache, maximal für JOIN, Abfragen genutzt.
                        Das Tutorial werde ich durchlesen!

                        Und noch mal Danke, Danke Danke!

                        Comment

                        Working...
                        X