Neuigkeiten
  • Die modified eCommerce Shopsoftware ist kostenlos, aber nicht umsonst.
    Spenden
  • Damit wir die modified eCommerce Shopsoftware auch zukünftig kostenlos anbieten können:
    Spenden
  • Thema: Performance: SQL oder PHP-Array?

    webald

    • modified Team
    • Beiträge: 2.791
    Performance: SQL oder PHP-Array?
    am: 12. Dezember 2017, 11:32:43
    Ich muss prüfen ob eine Funktion ausgeführt werden darf oder nicht. Insgesamt sind ca. 500 Funktionen vorhanden.

    1. Idee: Tabelle mit User-ID, Funktions-Nr., Status-Erlaubt
    => Pro User 500 Zeilen,
    => einfache Abfrage: Select Status-Erlaubt from tbl where User-ID = x and Funktions-Nr. = y

    2. Idee: Tabelle mit User-ID, Erlaubte-Funktionen
    => Pro User nur eine Zeile
    => Abfrage liefert in Erlaubte-Funktionen einen kommatgetrennten String zurück, der dann mit explode(Erlaubte-Funktion) in ein Array gewandlet wird und mit in_array() geprüft wird.

    Was ist schneller?

    Linkback: https://www.modified-shop.org/forum/index.php?topic=38375.0

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.990
    • Geschlecht:
    Re: Performance: SQL oder PHP-Array?
    Antwort #1 am: 12. Dezember 2017, 17:04:17
    Ein paar Gedanken die vielleicht helfen:

    Das dürfte nur mit dem Aufsetzen einer Routine zum Benchmarking beantwortbar sein.
    Auch dürfte es davon abhängen wie die Bedingungen sind (kluge Indizes n der DB, PHP-Version).
    Ich tippe allerdings, daß Version 2 schneller ist. PHP ist mit Arrays sehr schnell.

    In Version 1. kann ich mir die Umsetzung nicht ganz vorstellen.
    admin_access in modified ist ein Beispiel, wo allerdings, um die Beziehung zu deiner Sache herzustellen, nicht 500 Zeilen sondern 500 Spalten vorhanden wären.
    500 Zeilen pro User hieße nämlich bei deiner Version überhaupt nur 500 Zeilen in der Tabelle und nicht 500 Zeilen pro User; und zwar mit der Funktions-Nr. als PRIMARY KEY und den Users in Spalten.
    Oder wie genau willst du die DB-Tabelle in Version 1 aufbauen ?

    Ohne genaues Wissen über die Implementation und die Verwendung dahinter ist es auch schwer das überhaupt zu beantworten.
    Vorteil von Version 2 wäre theoretisch auch, daß du das Array mit den erlaubten Funktionen evtl. nur einmal bilden mußt (z.B. in eine Session speichern) und folglich pro User auch nur eine DB-Abfrage starten müsstest, während bei Version 1, soweit ich es verstehe, für jede Funktion eine einzelene Abfrage zu geschehen hätte.

    Vielleicht helfen die Gedanken ja ein wenig.

    Gruß,
    noRiddle

    webald

    • modified Team
    • Beiträge: 2.791
    Re: Performance: SQL oder PHP-Array?
    Antwort #2 am: 12. Dezember 2017, 17:43:27
    Dank für die Antwort.

    Die SQL-Tabelle zu 1 sollte so aussehen:
    Code: SQL  [Auswählen]
    CREATE TABLE api_access (
      `ID` INT(11) NOT NULL,
      `customers_id` INT(11) NOT NULL,
      `function_id` INT(11) NOT NULL,
      `allowed` tinyint(1) NOT NULL DEFAULT '0'
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    INSERT INTO api_access (ID, customers_id, function_id, allowed) VALUES(1, 1, 100, 1);
    INSERT INTO api_access (ID, customers_id, function_id, allowed) VALUES(2, 1, 101, 1);
    INSERT INTO api_access (ID, customers_id, function_id, allowed) VALUES(3, 1, 103, 0);
    INSERT INTO api_access (ID, customers_id, function_id, allowed) VALUES(4, 4, 101, 1);
    INSERT INTO api_access (ID, customers_id, function_id, allowed) VALUES(5, 4, 102, 1);
    INSERT INTO api_access (ID, customers_id, function_id, allowed) VALUES(6, 4, 103, 1);


    ALTER TABLE api_access
      ADD PRIMARY KEY (`ID`);


    ALTER TABLE api_access
      MODIFY `ID` INT(11) NOT NULL AUTO_INCREMENT;

    Mit
    Code: SQL  [Auswählen]
    SELECT `allowed` FROM `api_access` WHERE `customers_id` = 1 AND `function_id` = 102
    wird die Berechtigung geprüft.

    => Zeilenzahl der Tabelle ergibt sich aus Anzahl User x Anzahl Funktionen

    Allerdings läßt sich die Tabelle sehr gut indizieren.

    Das "Zugriffs-Array" in der Session zu speichern ist verlockend, aber leider unsicher und Sessions über Webservices (ist auch ein Teil der Aufgabenstellung) schwer zu realisieren.

    Das Array hätte dann den Vorteil, wenn man in einem Script mehrere zugriffsbeschränkte Funktionen aufruft, nur einmal einen Anfragen an den SQL-Server zu senden.

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.990
    • Geschlecht:
    Re: Performance: SQL oder PHP-Array?
    Antwort #3 am: 12. Dezember 2017, 18:34:11
    Die ID würde ich bei deinem Approach zu Tabelle 1 weglassen, sie hat keinen Sinn, und statt dessen den PRIMARY KEY setzen auf (customers_id, function_id). Das sollte sehr schnell sein insofern es nicht über eine Million Users gibt, aber selbst dann.

    Wenn du in einem Skript mehrere zugriffsbeschränkte Funktionen aufrufst kannst du ja trotzdem die Berechtigungen mit einer Query machen (WHERE function_id IN(...)) und mittels while-Loop in ein Array überführen.

    Gruß,
    noRiddle
    10 Antworten
    4968 Aufrufe
    11. März 2015, 19:03:17 von Matt
               
    anything