Datenbankabfrage mit Bedingung



  • Hi,

    ich speichere in einer Datenbank Konfigurationen für Computer. Dabei habe ich verschiedene Varianten, beispielsweise Mainboards, Festplatten, etc.
    Jetzt soll in meiner Datenbank z.B. die Eigenschaft HDD-Kabel stehen. Für die Variante X soll das den Wert 1 haben, für alle anderen den Wert 2. Ich habe mir gedacht, "für alle anderen" repräsentiere ich durch die Variante NULL. Also sähen die beiden Einträge so aus:

    Item      | Variant | Value
    ----------+---------+--------
    HDD-Kabel | NULL    | 2
    HDD-Kabel | X       | 1
    

    Davon gibt es jetzt eine ganze Reihe. Eine PC-Konfiguration besteht natürlich aus einem ganzen Satz an Varianten, für einen Eigenschaftseintrag kann aber nur eine Variante gesetzt werden.
    Jetzt möchte ich die Werte für meine PC-Konfiguration laden. Die Konfiguration beinhaltet die Varianten Y und Z. Wie gestalte ich jetzt meine Abfrage so, dass wenn für eine Eigenschaft keine dieser Varianten gesetzt ist, der Standardwert (Variant=NULL) geladen wird und sonst der zu der Variante gehörende?
    Oder sollte ich meine Datenbank anders strukturieren?

    PS: ihr wisst wahrscheinlich schon, dass ich mit ner SQL Datanbank arbeite 😉



  • Ich schieb den Beitrag nochmal nach oben...

    Vielleicht versuche ich es nochmal anders zu beschreiben. Ich möchte soetwas in der Art haben (Pseudocode):

    LoadVariant(X,Y):
    =================
    ForEach(Item) {
      if (VariantExists(X)) {
        GetVariant(X);
      }
      elsif (VariantExists(Y)) {
        GetVariant(Y);
      }
      else {
        GetVariant(NULL);
      }
    }
    

    GetVariant soll dabei vom aktuellen Item den Eintrag mit der entsprechenden Variante liefern.



  • es dürfte über ein paar subselects prinzipiell möglich sein. Allerdings geht das alles zu Lasten der Datenbankperformance. Ich würd daher die Abfrage aufspalten. Erst alles suchen, das einen passenden Variant hat und falls welche nicht dabei waren diese mit null laden



  • Es werden 1200 Items geladen, dabei können ca. 30 Varianten auftreten....



  • würde die varianten in eine matrix packen und dann einen string erstellen und auf die db jagen. Wieso muss die db so belastet werden?



  • Du solltest Dir Gedanken über Normalisierung machen.

    Ich verstehe zwar nicht ganz was Du machst aber

    Du hast eine Tabelle mit Mainboards, Festplatten etc.
    Jede dieser Datensätze hat eine eindeutige ID.
    eine 2. Tabelle mit dem Rechner der wieder eine ID hat.
    In einer 3. Tabelle führst Du beide zusammen.

    Die beinhaltet nur die IDs der beiden.



  • Genauso läuft es ja. Das X in meinem Beispiel ist ein ForeignKey aus der entsprechenden Tabelle.
    Mir geht es ja eher um die Logik. Also dass wenn ein Eintrag nicht mit der gesuchten Variante vorliegt, der "Default"-Eintrag ohne eingetragene Variante genommen wird (wenn es ihn denn gibt).
    Es ist zum Beispiel so, dass nur für Konfigurationen mit WakeOnLAN ein bestimmtes Power-Kabel verwendet wird, sonst immer das normale. Die Tabellen sähen dann so aus:

    Variants:
    =========
    ID | Value
    ---+-------
    1  | WOL
    2  | RAID
    ...
    
    BOM:
    ====
    ID     | Value
    -------+---------
    100105 | Power Cable
    100106 | Power Cable with WOL
    ...
    
    Configurations:
    ===============
    Item       | Variant | BomID
    -----------+---------+--------
    PowerCable | NULL    | 100105
    PowerCable | 1       | 100106
    ...
    
    GetConfiguration()  => PowerCable = 100105
    GetConfiguration(1) => PowerCable = 100106
    GetConfiguration(2) => PowerCable = 100105
    

    Und dann ist es auch noch so, dass GetConfiguration auch mehrere Varianten übergeben bekommen kann, da eine Konfiguration mit WOL auch gleichzeitig RAID haben kann:

    GetConfiguration(1,2,...) => PowerCable = 100106
    

    PRIEST schrieb:

    würde die varianten in eine matrix packen und dann einen string erstellen und auf die db jagen. Wieso muss die db so belastet werden?

    Das mit der Matrix versteh ich nicht ganz, kannst du das mal näher erläutern?


Anmelden zum Antworten