Konzeptfrage

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Ich entwickle gerade eine App mit Bezug zu Personen und Nahrungsmitteln.

    Ich möchte bei den Personen hinterlegen welche Allergien und Unverträglichkeiten vorliegen. Ich speichere das im Moment so, dass ich jedem Switch einen Wert zugewiesen habe und diese Werte addiere und dann nur eine Zahl in die Datenbank (SQLite) schreiben muss um alle Möglichkeiten zu erfassen. (1.Switch = 1.000.000, 2.Switch = 100.000, 3.Switch =10.000 usw.)

    Es kann sich also der Wert 1000000, 1000, 1 oder 1001000 ergeben.

    1. Frage: Gibt es was einfacheres?

    2. Frage: Wenn ich das gleiche bei den Nahrungsmitteln speichern will, um Überschneidungen zu prüfen, bin ich nicht im klaren wie ich bei der Datenbankabfrage mit einfachen Mitteln einen Treffer erziele.

    Beispiel: Person hat Allergien mit dem Schlüssel 1001000 und das Nahrungsmittel aber nur 1000. Bedeutend ja eine Übereinstimmung. Stehe im Moment auf dem Schlauch wie ich das Abfragen kann.

    Ich hoffe, die Fragen sind verständlich dargestellt.
    Dateien
  • Im Code wäre klar ein AND-Operator, durch den Du mit einer Bit-Maske vergleichen könntest ... allerdings wüsste ich nicht, wie / ob man es mit SQL erreichen kann.

    Ich würde mir allerdings überlegen, ob Du die Sache nicht unnötig verkomplizierst: Aus welchem Grund möchtest Du mit Bit-Masken arbeiten? Wäre es nicht viel einfacher, jedem Merkmal sein eigenes Attribut zu spendieren? Am benötigten Speicherplatz wird es wohl kaum liegen, oder?

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Also ich würde so eine "Optimierung" nur machen wenn ich Millionen von Personen hätte.

    Anderfalls würde ich schön brav eine Tabelle mit Personen machen, eine Tabelle mit Unverträglichkeiten und eine Tabelle mit Cross-Verweisen von Unverträglichkeiten zu Personen.

    Damit kann man dann auch vernünftige Abfragen machen.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Mit Bit-Masken mache ich es nicht, sondern

    C-Quellcode

    1. NSInteger unvertraeglichkeit = 0;
    2. if (_Outlet_Gluten.isOn) unvertraeglichkeit = 1000000;
    3. if (_Outlet_Laktose.isOn) unvertraeglichkeit += 100000;
    4. if (_Outlet_Fructose.isOn) unvertraeglichkeit += 10000;
    5. if (_Outlet_Histamin.isOn) unvertraeglichkeit += 1000;
    6. if (_Outlet_Sorbit.isOn) unvertraeglichkeit += 100;
    7. if (_Outlet_Saccharose.isOn) unvertraeglichkeit += 10;
    8. if (_Outlet_Galaktose.isOn) unvertraeglichkeit++;
    9. patient.unvertraeglichkeit = unvertraeglichkeit;

    Ich wollte mir eben die Speicherung jedes einzeln Wertes sparen. An die Kombination und die damit notwendige Abfrage habe ich auch erst später gedacht.

    Die separate Tabelle dafür ist natürlich auch eine Variante, dass bläht die Tabelle der reinen Personendaten nicht so auf.

    Danke für die Tipps und Hinweise.
  • Ablauf ist so, dass ich die Person habe für die ein Essenplan zusammengestellt werden soll. Dazu werden dann aus einer Liste die Nahrungsmittel ausgewählt. Bei einer Übereinstimmung der Allergien soll das Nahrungsmittel markiert werden bzw. nicht auswählbar sein. Also habe ich ja die Daten der Person geladen und gleiche den Allergie-Schlüssel mit dem der Nahrungsmittel aus der geladenen Liste ab.

    Die Nahrungsmittel mit Treffer gleich wegzulassen, ist nicht gewünscht.
  • Naja den gesamten query kann man aber auch die DB machen lassen, so dass man eine Liste mit Nahrungsmitteln zurück bekommt die entsprechend der Unverträglichkeiten markkiert sind....

    Da ist überhaupt keine Client logik notwendig.
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Ich kenne Leute die auf bestimmtes allergisch reagiert haben und dann irgendwann nicht mehr (kein Einzelfall)

    In solchen Fällen musst du dann immer deine „Bit“ Zahl überarbeiten
    Das würde entfallen wenn du table hättest wie
    User
    Allergie
    User2Allergie

    Zusätzlich frage ich mich was du machst wenn noch Allergien dazu kommen?

    Wenn jetzt schon ein Switch 1.000.000 ist dann deckst du aktuell gerademal 7 Lebensmittel ab.
    Wie groß soll denn die Zahl dann irgendwann mal werden?

    Unterschiedliche Gemüsesorten fehlen zB noch komplett.
    Ich weiß nicht immer wovon ich rede aber ich weiß das ich Recht habe. :saint:
  • Nur mal so als Beispiel weil ich gerade Lust dazu habe, wie man eine Datenbank effektiv einsetzt und nicht nur als Datenhalter wie es die meisten tun:

    TABLE person
    person_id INT PRIMARY KEY AUTOINCREMENT
    person_name VARCHAR[]

    TABLE food
    food_if INT PRIMARY KEY AUTOINCREMENT
    food_name VARCHAR[]

    TABLE xfoodperson
    xfp_personid INT PRIMARY KEY
    xfp_foodid INT PRIMARY KEY
    xfp_usable INT (1 or 0 if person can eat this or not)

    Jetzt kannst du mit einem query alles abfragen was du wissen willst:

    z.B für eine Person was sie essen kann und was nicht:

    SELECT food_id, food_name, IF(xfp_usable = 1, 'ALLOWED', 'NOT ALLOWED) AS food_allowed
    FROM xfoodperson
    JOIN food ON (food_id = xfp_foodid)
    JOIN person ON (person_id = xfp_personid)
    WHERE person_id = :id

    Fertig. Schon bekommst du eine schöne Liste für eine Person in der steht welches Nahrungsmittel er verträgt und welches nicht.

    Keine Cleint Logik notwendig, kein Speicher oder Prozessorlast auf dem Client notwendig.

    GRuß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • WernerB schrieb:

    Er sprach von einer App - also gehe ich mal von iOS aus. Und auch für Android gibt es entsprechende ORM-Alternativen.
    Eine App als Insellösung finde ich immer sehr unpraktisch. Wenn ich sowas mache, dann benutze ich einen Server wo ich die Datenbank hoste und alle Clients greifen darauf mit dem gleichen Webservice zu.Somit habe ich vorneherein ein Framework das mit iOs, Android, OSX, Windows, Linux etc etc funktioniert.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Thallius schrieb:

    WernerB schrieb:

    Dann nimmst Du einen freien App-Server a la JBoss mit Hibernate oder EclipseLink und lässt das Fuhrwerken in einer DB.
    *grusel* Wenn ich das Wort Hibernate nur höre stellen sich mir die Nackenhaare auf. Es gibt absolut nichts was inperformanter ist als der Dreck...
    Dann pfleg mal eine Applikation mit mehreren hundert persistenten Klassen inkl. Vererbung, Assoziation, Aggregation etc. auf SQL-Basis. Viel Vergnügen.. Und richtig performant wird es, wenn man keine Schatteninstanzen wie in EclipseLink verwendet und statt eines Attributes gleich deren zig updatet.
    Mir ist der OR-Mismatch bekannt, aber man sollte sich über die Eigenschaften solcher Frameworks mal informieren. Insbesondere, wenn man es mit mehr als einer Handvoll Tabellen mit wenigen Attributen zu tun hat.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von WernerB ()

  • WernerB schrieb:

    Thallius schrieb:

    WernerB schrieb:

    Dann nimmst Du einen freien App-Server a la JBoss mit Hibernate oder EclipseLink und lässt das Fuhrwerken in einer DB.
    *grusel* Wenn ich das Wort Hibernate nur höre stellen sich mir die Nackenhaare auf. Es gibt absolut nichts was inperformanter ist als der Dreck...
    Dann pfleg mal eine Applikation mit mehreren hundert persistenten Klassen inkl. Vererbung, Assoziation, Aggregation etc. auf SQL-Basis. Viel Vergnügen.. Und richtig performant wird es, wenn man keine Schatteninstanzen wie in EclipseLink verwendet und statt eines Attributes gleich deren zig updatet.Mir ist der OR-Mismatch bekannt, aber man sollte sich über die Eigenschaften solcher Frameworks mal informieren. Insbesondere, wenn man es mit mehr als einer Handvoll Tabellen mit wenigen Attributen zu tun hat.
    Sorry aber wieso sollte es performanter sein wenn ich noch komplexere Daten habe?

    Das von mir gegebene Beispiel hat, wenn ich es mit hybernate mache einen Performance loss von ca Faktor 15 und das wird auch nicht besser wenn ich mehr Klassen und Verknüpfungen derer habe.
    Und ja, die Applikation an der ich im Moment arbeite hat knapp 100 Tabellen und entsprechend viele Klassen und der User wartet bei keiner Aktion innerhalb der Software länger als 1s bis er eine Antwort erhält.
    Klar ist es viel einfacher sowas mit hybernate zu modellieren aber es ist eben auch um etliches langsamer.
    Ich kann nicht damit leben wenn mein User 10s auf eine antwrort warten muss, auch wenn das heute tatsächlich Usus zu sein scheint. Aber gerade dafür lieben mich meine Auftraggeber (und bezahlen mich überdurchschnittlich gut), weil ich eben nicht das abliefere was heute der Mainstream Standard ist, sondern Software die Spaß macht sie zu benutzen....
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)