kostenloser Webspace werbefrei: lima-city


Array-Daten in MySQL speichern

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    feedping

    feedping hat kostenlosen Webspace.

    Hallo

    Ich habe ein Script, das für jeden User eine gewisse Anzahl an SubIDs verwaltet
    also zu jedem User gibt es eine variierende Zahl an dazugehörigen Nummern (SubIDs)

    Bei Aufruf des Scripts wird eine aktuelle Liste der Nummern (SubIDs) geladen (als Array)
    dann soll geprüft werden, welche Veränderungen der frisch geladenen Nummern (SubIDs)
    zum Bestand in der DB gibt ... ob neue dazu gekommen sind oder ob alte nicht mehr aktuell sind.

    jetzt die Frage:

    ist es besser die einzelnen Nummern als eigene DB-Einträge (Zeilen) zu speichern ?
    dann hätte ich direkten Zugriff und kann sie schnell einzeln entfernen / neue INSERTen

    oder alle in einen grossen TEXT Block mit serialize() um das ganze Array zu speichern ?
    dann muss ich für Änderungen immer das ganze Array (alle Nummern) durchgehen

    Manche User haben bis zu 5000 Nummern zugewiesen, andere nur 10

    wie würdet Ihr es machen? einzelne Zeilen je Nummer oder alle in einem Block?
    Danke


    Beitrag zuletzt geändert: 16.8.2011 18:06:54 von feedping
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. ähm, schonmal was von relationalen Datenbanken und Zuordnungtabellen gehört? oO

    die kannst du einfach mit einem where auf die User-ID abfragen und hast die dann einzeln vorliegen... kein hin und hergemosere mit serialize etc...

    außerdem sind aktualisierungen einfacher... ändert sich ne zuordnung, musst du sonst den block auseinandernehmen, vergleichen und dann entweder anfügen oder verwerfen, wenn kein grund zur änderuung da ist...

    du kannst es später ja immer noch ein array packen nach anzahl der zuordnungen und diese zuordnungen sogar temporär in die session laden, damit die anzahl der Datenbankabfragen sich in grenzen halten...
  4. Autor dieses Themas

    feedping

    feedping hat kostenlosen Webspace.

    oki, danke

    Edit:

    habe jetzt mal beide methoden ausprobiert
    und wenn ich das mit einem grossen array als serialize in TEXT speichere
    dann ist die Script-Laufzeit deutlich geringer, als hunderte einzelne Zeilen durchgehen

    ok, in einzelnen Zeilen ist es vielleicht "ordenlicher" aber wohl lagsamer (für meinen Zweck)
    weil ich so anstatt einem MySQL query soviele brauche, wie es Änderungen gibt.

    ... oder ich mache da grundsätzlich was falsch ... oOo ...


    noch ne Frage zum Daten-Typ
    die Nummern sind bis zu 20 Zeichen lang (String aus Zahlen)

    was ist da besser , bigint oder varchar ?
    Danke!

    Beitrag zuletzt geändert: 17.8.2011 20:40:21 von feedping
  5. da ich nciht weiß um was für art daten es handelt und wie der zugriff darauf erfolgen muss, kann ich dir dazu nichts genaueres sagen... bei meiner methode weiß ich, dass sie weniger fehleranfällig ist und wenn man sie richtig einsetzt auch recht performant ist... bei der Serialize-Methode musst du die fehleranfälligkeit selbst rausbügeln und zusätzliche abfragen mit rein packen und ab da wird das dann richtig Langsam...

    vielleicht gäbe es eine 3. möglichkeit, wenn wir deinen Einsatzzweck kennen, die dann elegant das problem umschifft... ich bin kein freund von Workarounds^^

    und ich weiß ich nicht, wie schnell das sein soll... solange es nciht darum geht software damit zu entwickeln, deren einsatz im deutschen rechtsraum nicht zulässig ist, können wir dir helfen...
  6. Autor dieses Themas

    feedping

    feedping hat kostenlosen Webspace.

    Hallo

    also im Klartext geht es darum eine kleines TwitterTool zu basteln, das denke ich durchaus "legal" ist
    deren Haupt-Aufgabe soll es sein, neue und verlorene Follower / Friends zu erkennen
    und herauszufnden, welche User, denen man folgt auch zurück-folgen.

    Beim ersten Login (Twitter oAuth) werden alle Follower-IDs und alle Friends-IDs per Twitter API abgeholt und gespeichert.
    es gibt (derzeit) zwei Tabellen: (mySQL)
    a) id - UserID - FollowerID ... (id = Auto Increment)
    b) id - UserID - FriendsID

    Bei jedem weiteren Aufrufen werden dann wieder diese IDs von der API abgeholt und mit dem Bestand in der DB verglichen.
    Neue Follower oder Friends werden hinzugefügt, verlorene Folower und Friends werden gelöscht

    Per Script (PHP) soll der User dann abfragen können:
    - welche anderen User (seit letzem Aufruf) neue Follower bzw. neue Friends (=following) sind
    - welche der Follower (seit letzem Aufruf) entfolgt sind bzw. auch welche Freunde weg sind
    - welche anderen User zurück-folgen (Followed by User and Following back)
    - usw...

    Wenn das erstmal gut funktioniert, ist geplant das mit weitern Listen zu erweitern,
    z.B. Listen, Favoriten, Retweets, Erwähnungen, etc.
    ... aber erstmal die Grundfunktion

    Script läuft bisher etwa so: (am Bsp Follower, analog dann auch Friends, etc)
    ... bei mir jetzt noch mit einem Array und serialize()

    if ( USER logged with in oAuth) {
    if ( USER startet Aktion) {
    + hole neue Follower IDs von API = Array a
    + hole alte Follower IDs von DB = Array b
    + vergleiche IDs (if in_array) neue IDs an Array b anfügen, verlorene aus Array b raus werfen
    + speichere neues Array b in DB
    }
    }

    das klappt zwar, aber stimmt schon, mit einzelnen Zeilen könnte man viel mehr "machen"
    zu jeder ID ein Datum und ein Status dazu
    - dann kann man Abfragen machen wie "neue Follower seit Datum x" ... besser als seit letzem Aufruf
    - oder auch UnFollowed User in der DB behalten und mit entsprechendem Status merkieren
    - oder auch haerausfinden wenn jemand der schonmal entfolgt ist wieder folgt ... etc.

    Habe eine zweite Version angefangen, die mit einzelnen Zeilen arbeitet (ohne serialize)
    aber da hab ich noch nicht kapiert, wie ich die Vergleiche Neue / Alte IDs anders machen kann
    bisher vergleiche ich mit if ( in_array ) ... für Beispiele mit WHERE wäre ich sehr dankbar

    a) id - UserID - FollowerID - Datum - Status
    b) id - UserID - FriendsID - Datum - Status

    foreach ( IDs aus der API-Abfrage ) {
    INSERT INTO ... (wenn ID noch nicht in DB ist) ...
    UPDATE ... SET status = 'lost' ... (wenn ID nicht mehr in Array aus API ist)
    ...
    }
    ... ?

    So jetzt wisst Ihr "etwas" genauer, was ich machen will, und könnt mir vielleicht besser helfen.

    Zur Info: ja ich weiss, das es schon ähnliche Twitter Tools gibt aber ich nutze das quasi als Übung, um PHP und MySQL etwas besser kennen zu lernen. Mit MySQL habe ich noch sehr wenig Erfahrung. Und zum Einsatz kommen soll das Script nur privat für mich und für einige Freunde. Und was gibts besseres als ein konkretes Projekt, um daran zu lernen, Twitter API deshalb, weil es ganz gut dokumentiert ist und immer Daten "zum damit arbeiten" liefert, also Ideal zum üben.




    Beitrag zuletzt geändert: 18.8.2011 10:27:52 von feedping
  7. ui...

    ich kenn mich mit diesem Twitter zwar nciht aus, ich habe bisher noch nicht mal die startseite von twitter gesehen (und werd es auch nicht nachholen, meine cronik bleibt sauber^^)

    aber für mich hört es sich schon wie ein automatisches Analysetool an, was du da machen willst... und in den AGBs der meisten Sozialen Netzwerke steht drin, dass dieses systematische abgrasen der daten und Profil erstellen untersagt ist... also wenn es wirklich nur dazu da ist, deine fähigkeiten zu testen, dann such dir besser ein anderes projekt.

    Warum:

    1. bekommst du durch eine API bereits aufgearbeitete Datenbestände aus einer anderen Datenbank, deren struktur du nicht kennst. Du kannst und darfst die daten auch nicht soweit rekonstruieren, da das wieder zu profilerstellung und analyse führt... und wenn das nicht mal die Bundesregierung darf, dann sind die besonders angepisst wenn du das machst^^

    2. ist diese struktur, die du da analysieren willst nicht unbedingt stellvertretend für viele Datenbanksysteme. Solche Systeme sin d zum teil historisch gewachsen, zum teil nur workarounds um irgendwelche anforderungen zu erfüllen, die keiner kennt. Zumindest kannst du es nicht verwenden, um rückschlüsse zu ziehen.

    3. schrammt das thema hart an der toleranz solcher seitenbetreiber... zum einen wegen traffic (unnötige datenbankbelastung) zum anderen wegen Sicherheit... gab oft genug fälle, wo leute andere Leute ihr komplettes soziales Umfeld über so ein teil ausgespäht und systematisiert haben...



    wenn du etwas umfassendes mit datenbank zu tun haben willst, dann schnapp dir ein cms und schreib dir dafür kleine zusätze... da hast du die datenbank direkt bei dir liegen...

    ----------------------------------
    das war erstmal allgemein dazu. Gemäß dem fall, du wilslt daran weiter arbeiten, werd ich dir mal ein paar hinweise geben:

    bei diesen beiden tabellen, die du aus der API ziehst, hast du schon 2 zuordnungstabellen vorliegen.

    UserID, FollowerID und FriendsID werden dieselbe tabelle als grundlage haben, nämlich die UserDb oder wie auch immer die das nennen... außer die erstellen für die besucher eine temporäre dummy-ID die nochmals in einer anderen tabelle gelagert ist, wo der verweis auf den wirklichen user liegt, um dieses Automatische auslesen zu nterbinden... so würde ich es zumindest machen, wenn ich nciht will, dass jemand meine social network-software ausspioniert und versucht darüber fertige nutzerprofile zu machen...

    aber wie willst du es regeln, dass du weiß, welcher datensatz zu wwelcher Zeit angelegt wurde? ich seh da nirgends eine angabe zum erstellungsdatum... oder sind das temporäre tabellen die jeweils aktuell bei der abfrage sind?

    dann dürften differenzen sich sehr schnell rausfinden lassen...

    also folgendes, nehmen wir an, das ist so wie ich denke, dass du immer den kompletten aktuellen stand aller followers und der Freunde bekommst, machst diesen scan 1 mal in der stunde, einmal 0 Uhr und 1 mal 1 uhr, der einfachkeit halber und speicherst die tabelle mit dem dazugehörigen zeitstempel ab.

    dann brauchst du diese Tabellen nur nach dem primärschlüssel abfragen, den du mit überliefert bekommen hast (ich nehme an, der sollte gleich sein?)

    dann fragst du einfach über das where ab, ob die alte tabelle dieselben IDs vorgelagert hat, wie die neue. das kannst du in 2 richtungen machen: alte->neue: du bekommst diefollowers und freunde raus, die weg sind
    neu->alt: du bekommst die neu dazugekommenen raus. das sind 2 abfragen und du musst dich mit der verarbeitung nciht mehr rumplagen... die Follower-ID kannst du dir bei der ausgabe gleich mitliefern lassen...

    so würde es gehen, wenn es so ist, wie ich es verstanden habe^^

  8. Autor dieses Themas

    feedping

    feedping hat kostenlosen Webspace.

    Hallo

    ja, das soll ein Analysetool werden. So wie hunderte andere auch.
    Man wird ja wohl noch für seinen eigenen Account eine Analyse machen dürfen,
    und genau dafür wird die Twitter-API ja auch bereit gestellt, um Tools damit zu bauen
    Alle Daten die man mit der API abfragen kann sind öffentlich für jederman zugänglich
    es wird ja auch nichts gehackt oder ausgespäht, nur Verfügbares abgefragt und sortiert.

    Auch gibt es doch schon viele solcher Tools, auch "deutsche", also kann ich mir nicht vorstellen dass das ein rechtliches Problem darstellt, wenn man als User seine eigenen Verbindungen in Twitter analysiert. Ich gehe also davon aus, das Twitter-Analysen grundsätzlich erlaubt sind. Sollte jemand andere Informationen dazu kennen, dann kann er diese gerne hier als Antwort screiben.

    zu Daten (Sruktur):
    ... völlig egal welche Twitter-interne Datenbank dahinter steht, die API-Abfrage liefert ein json Code (Objekt/Array) und genau darum geht es mir bei diesem Übungs-Projekt: externe Daten (Objekt/Array) in eigener Datenbank (MySQL) verwalten.

    zu Sicherheit:
    ... deswegen gibt es ja das oAuth Verfahren von Twitter, bei dem der User authentifizieren muss, um das Tool zu nutzen,

    zu Traffic:
    ... da hat Twitter schon dran gedacht und jeder Applikation ein Limit der Abfragen (pro Stunde) gesetzt.



    muss ja auch nicht Twitter sein, aber ich will was mit ner API üben, da bringt CMS wenig
    also bleib ich erstmal dran ... mir gehts jetzt nicht um das Warum, sondern um das Wie

    zur ursprünglichen Frage

    egal wie ich es angehe, muss ich doch immer beide Arrays komplett durchgehen ?
    oder?

    $array1 = (IDs aus der API) ... (API-Response mit REST API / curl / json )
    $array2 = (IDs aus der DB) ... (aus Abrage mit SELECT * WHERE user_id = $logged_in_userid )

    das sind 2 einfache Arrays mit fortlaufenden Keys und der Nummer im Vaue
    dann ..

    foreach( $array1 as $item1) {
    if (!in_array( $item1 , $array2 ) { ... Aktion für Neue ID .. } // neue ID ist nicht in DB-Array
    }

    foreach( $array2 as $item2) {
    if (!in_array( $item2 , $array1 ) { ... Aktion für Lost ID .. } // die ID aus DB ist nicht in API-Response
    }

    So hab ich zuwest die Abfrage aller IDs aus der DB (um $array2 zu bekommen)
    und dann für jede einzele Aktion Insert bzw. Update (oder Delete) Abfragen


    Wie soll das direkt über eine MySQl Abfrage mit WHERE gehen ? also ohne $array2 zu holen?
    Sorry, ich kapiers nicht wie? ... Code-Beispiel .. nur so grob ?!
    Danke



  9. gut, langsam versteh ich das prinzip, also UserID ist den dem fall also immer deine eigene und Follower/FriendsID die jeweilige ID des users der mit dir interagiert hat auf die eine oder andere art...

    also, du holst dir komplett erstmal alles, was dir die api ausspuckt in die db rein, genau in der Form, wie du es mir gepostet hast.

    dann machst du einen timestamp oder dokumentierst dir eine Fortlaufende nummer intern, wonach die datenbanken nummeriert werden und gehst die letzten beiden nummern durch und behälst immer den aktuellen counter im auge oder du notierst dir die letzten beiden aktuellen timestamps (machst du am besten gleich mit in die db, man muss solche informationen nicht fitzelweise an unterschiedlichen orten Speichern.

    und du brauchst dann gar kein eigenes Array mehr, sondern arbeitest das Array ab, was du durch den SQL ausdruck erhälst. Codebeispiel gebe ich dir nicht, schließlich willst du es lernen, also wirst du irgendwo waws haben, wo du nachlesen kannst, wie es geht, ich liefer dir nur den denkanstoß.

    Select [t_follow0..FollowerID]
    From t_follow0, t_follow1
    Where (t_follow0.FollowerID=t_follow1.FollowerID);

    mit der abfrage alt zu neu bekommst du raus, welche IDs verschwunden sind, hier mach ich sogar die variante, wo du die interne ID gar nciht brauchst, für den fall, dass die immer zufällig generiert wird und nciht gleich pbleibt je follower...
    tausche 0 durch 1 und 1 durch 0 nd du bekommst den aktuellen Status raus, was neu hinzu kam...
  10. Autor dieses Themas

    feedping

    feedping hat kostenlosen Webspace.

    Hallo

    Danke, ...ahhhhhh .... MySQl JOIN ...

    das kann ich nutzen um FollowBack zu finden, also IDs in beiden Tabellen gleich

    $result1 = mysql_query("
     SELECT * FROM ".$db_tabelle1.", ".$db_tabelle2." 
     WHERE ".$db_tabelle1.".followerr_id = ".$db_tabelle2.".friends_id 
     AND ".$db_tabelle1.".user_id = '".$loguser_id."'
    ");


    doch noch was gelernt ...JOINs :) .... Prima für das Suchen von "Verbindungen"

    Aber einen Sinn für die Updates der neuen IDs sehe ich darin noch keinen,
    denn dazu müsste ich je "Typ" (Follower und Friends) jewels noch eine "neue" Tabelle anlegen
    um dort die jeweils neuen IDs aus der API-Abfrage zu speichern.
    ... und dann für neue IDs mit = und für verlorene IDs mit <> Abfragen
    und dann diese zwei Ergebnisse wieder in den ursprünglichen Tabellen speichern,
    .... klingt für mich nach deutlich mehr Aufwand als zweimal die Array durchzugehen
    würde schon funktionieren .... fragt sich nur was performanter / schneller ist ....
    weil bei jedem Aufruf die "neuen" Tabellen mit bis zu tausenden IDs zu füllen oOo...
    oder ist das deutlich besser als ein foreach() mit sooooo vielen Werten zum Vergleich

    mal anders gefragt (ohne MySQL) ... wie vergleicht man am besten 2 einfache Arrays
    und bekommt als Ergebnis 2 neue Arrays, eins mit den neuen Einträgen und das Andere
    mit den raus-geflogenen Werten.

    ich finde meine Methode schon garnicht schlecht, hier als BSP:

    $array1 = ("100", "101", "102", "104", "106", "108");   // --- aus API 
    $array2 = ("100", "102", "103", "104", "107");          // --- aus DB 
    
    $new_data = array();  
    foreach( $array1 as $item1) {
      if (!in_array( $item1 , $array2 ) { $new_data[] = $item1;  } 
    }
    
    $lost_data = array();  
    foreach( $array2 as $item2) {
      if (!in_array( $item2 , $array1 ) { $lost_data[] = $item2;  } 
    } 
    
    - - - - - - - - - - - - 
    Ergebnis: (für DB Updates) 
    
    $new_data = array ("101", "106", "108");  
    $lost_data = array ("103", "107");


    aber vielleicht gehts DAS ja auch besser
    :)



    Beitrag zuletzt geändert: 18.8.2011 22:44:25 von feedping
  11. vielleicht mal noch ein denkanstoß:#


    du fragst bei einem join ab, welche übereinstimmungen du in einer stelle hast...

    du kannst mit einer einzigen abfrage auch die differenzen von einer tabelle zur andern ab fragen und schon hast du alle geänderten IDs raus^^ dein script wird wesentlich kleiner, weil du nur noch die ausgabe der datenbank verarbeiten musst. SQL ist wesentlich komplexer, als es auf dem ersten blick den anschein hat...
  12. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!