Sehr viele Spalten auslesen, sinnvoll?Performance?
Phil Z.
- datenbank
Hallo.
Im moment arbeite ich an einem Spiel.
Darbei muss ich bei jedem laden der Seite an die 70 Spalten auslesen.
Ist es sinnvoll die alle in eine Tabelle zu packen?
Ich gehe davon aus das es sehr stark die Performance herabsetzt.
Gibt es einen Trick wie man sie schneller ausliest?
Bisher würde ich es so machen(Ich benutze eine MySQL Datenbank weil mein Provider kein PostgreSQL unterstützt -.-):
$c=mysql_connect($host,$user,$pw) or die (mysql_error());
mysql_select_db($datenbank,$c) or die (mysql_error());
$sql="SELECT * FROM tabelle WHERE id ='$id'";
$query=mysql_query($sql) or die (mysql_error());
$array = mysql_fetch_array($query);
$name=$array["name"]; # wenn ich z.B. die Spalte "name" auslesen will
Ich hoffe das dass so klappt. Und wenn ja geht es irgendwie schneller? Kann sein das ich mir das nur einbilde aber 70 Datensätze auslesen und einer Variable auslesen scheint mir ein wenig viel.
Und _ja_ ich muss immer alle laden. =/
Geht nicht anders.
mfg
Phil Z.
Hi,
Und _ja_ ich muss immer alle laden. =/
Geht nicht anders.
Dann bastel ein bisschen an deiner Datenstruktur. Es gibt z. B. bestimmt ein paar Felder, die du mittels den Typen SET und ENUM zusammenfassen kannst...
e7
hi,
Im moment arbeite ich an einem Spiel.
Darbei muss ich bei jedem laden der Seite an die 70 Spalten auslesen.
Ist es sinnvoll die alle in eine Tabelle zu packen?
Hast du sinnvoll normalisiert?
$sql="SELECT * FROM tabelle WHERE id ='$id'";
Warum soll ich nicht SELECT * schreiben?
Kann sein das ich mir das nur einbilde aber 70 Datensätze auslesen und einer Variable auslesen scheint mir ein wenig viel.
Was denn jetzt, Datensätze (Zeilen) oder Spalten?
gruß,
wahsaga
Moin!
Das mit dem Asterix (*) ist nicht so hübsch. Es ist generell besser, die Spalten, die man auslesen will auch zu bestimmen:
Also nicht:
$sql="SELECT * FROM tabelle WHERE id ='$id'";
[...]
$name=$array["name"]; # wenn ich z.B. die Spalte "name" auslesen will
sondern:
$sql="SELECT 'name' FROM tabelle WHERE id ='$id'";
Bei mehreren:
$sql="SELECT 'name','vname' FROM tabelle WHERE id ='$id'";
Zur Sicherheit:
$sql="SELECT 'name','vname' FROM tabelle WHERE id='mysql_real_escape_string($id)'";
siehe http://de2.php.net/manual/de/function.mysql-real-escape-string.php
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix®
Also ich meinte das so.
- - - - - - - - - - - -
es gibt 70 Spalten (-),
bei jedem aufruf der Seite muss ich ALLE Zellen auslesen wo spalte id= Variable $id.
Hoffe das war verständlich genug.
Von daher auch (*) weil ich eh alles auslesen muss.
Oder soll ich ein SELECT mit 70 uz selektierenden Begriffen angeben?
mfg
Phil Z.
Hallo Philipp,
es gibt 70 Spalten (-),
ja, das haben wir verstanden.
bei jedem aufruf der Seite muss ich ALLE Zellen auslesen wo spalte id= Variable $id.
Von daher auch (*) weil ich eh alles auslesen muss.
Nein. Eine Begründung dafür wurde Dir bereits verlinkt.
Oder soll ich ein SELECT mit 70 uz selektierenden Begriffen angeben?
Ja, das ist empfehlenswert.
Philipp, Du fragst, welche Sprachen Du lernen solltest (ich empfehle Dir Englisch), Du fragst, welches Tutorial wir Dir für PostgreSQL empfehlen können, ich empfehle Dir das Handbuch.
Ganz grundsätzlich empfehle ich Dir, Dich mit den Grundlagen von Datenbanken allgemein, mit den Grundlagen der heute weit verbreiteten relationalen Datenbankmanagementsysteme (DBMS), mit den Grundlagen anderer aktueller DBMS, wie z.B. objektrelationaler DBMS, auseinanderzusetzen. Ach ja, der Abschnitt in SELFPHP ist ziemlich mangelhaft. Einen recht guten Einstieg, auch zu weiterem Lesestoff bietet dagegen Wikipedia.
Sicherlich heißt das nicht Trockenschwimmen - es gibt nicht besseres als die Grundlagen anhand eines konkreten Projektes zu erlernen oder zu vertiefen. Ich habe jedoch den Eindruck, dass Dir genau diese Grundlagen fehlen, dass Du aus diesem Grund zu einer Tabelle mit 70 Spalten greifst. Ja, 70 Spalten können durchaus mal erforderlich sein, aber nur ganz selten.
Es ist interessant immer wieder zu sehen, dass gerade Anfänger solche Tabellenmonster bauen, die nicht im geringsten sinnvoll sind, dass Anfänger in Spalten unterbringen, was in Zeilen gehört. Dass Anfänger fragen, wie man dynamisch die Tabellenstruktur ändert (was höchst selten erforderlich ist, in einer normalen Anwendung im laufenden Betrieb überhaupt nicht). Auch wenn ich die Tabelle noch nicht gesehen habe, sagt mir mein Gefühl, dass Du auf wahsaga hören solltest und Deine Tabellen normalisieren solltest.
Einen Einstieg dazu findest Du in den Datenbankartikeln in SELFHTML aktuell. Insbesondere Rouvens Einführung in Joins möchte ich Dir ans Herz legen, ganz bestimmt wirst Du kurz darauf Dich mit fortgeschrittenen Jointechniken befassen wollen.
Über Performanceprobleme brauchst Du Dir derzeit noch keine Gedanken zu machen.
Freundliche Grüße
Vinzenz
Hey Vinzenz,
du hasst Recht. Habe mal über deine Worte nachgedacht.
Su hasst Recht ich lerne immer nur anhand Projekten d.h. das was ich gerade brauche eigne ich mir an .. mehr auch nicht.
Wird sich ändern. Ich ugck emir jetzt erstmal alles mit den Datenbanken und mit JOINS an und wenn ich DANN noch eine Frage zu meinem obrigem Problem habe, stell ich sie erneut ;) =) ...
Danke...
mfg
Phil Z.
hi,
Hey Vinzenz,
du hasst Recht.
Vinzenz - ein Anarchist?
gruß,
wahsaga
Hallo nochmal.
Hm. Irgendwie glaub ich das ich die JOINS Hier weniger gebrauchen kann in meinem Fall.
Oder siehst du das anders ich versuche mein Vorhaben mal ganz gründlich darzustellen.
Ich habe 70 Spalten
Bei jedem Aufruf von xxx.php, muss ich alle Zellen wo Spalte id = $id ist auslesen.
Auch die die den Wert 0 haben, da ich sie zu Berechnungen brauche.
Ich seh eigendl. keinen Untschied ob ich JOINS verwende oder nicht außer das es die große Tabelle in kleinere unterteilt. =/
Weder de Einführung, noch der Bericht über die Fortgeschritenen Joins noch die Einführung von SelfPHP helfen mir beim Verständnis.
Was bringen mir JOINS?
Wann wie anwenden?
Bei meinem Fall notwendig(oder empfehlenswert)?
:(
mfg
Phil...
hi,
Ich habe 70 Spalten
Bei jedem Aufruf von xxx.php, muss ich alle Zellen wo Spalte id = $id ist auslesen.
Auch die die den Wert 0 haben, da ich sie zu Berechnungen brauche.
Das sagt ja noch nichts darüber aus, ob es auch sinnvoll ist, diese Daten in 70 Spalten eines Datensatzes abzulegen.
Ich seh eigendl. keinen Untschied ob ich JOINS verwende oder nicht außer das es die große Tabelle in kleinere unterteilt. =/
Tja, siehste, das ist Teil des Normalisierung genannten Vorgangs.
Ob das in deinem Falle sinnvoll ist, kann man dir nicht sagen - solange du keinem sagts, was für Datenobjekte du eigentlich in der DB ablegen willst.
Auf deren Struktur kommt es an, wie die Daten am sinnvollsten abgelegt werden sollten.
Deine Frage, wie man die dann ausliest und irgendwas damit berechnet, kommt eigentlich erst später.
Erst mal muss ein sinnvolles Datenmodell stehen.
gruß,
wahsaga
Hallo.
Von den ca70 Spalten, werdn in ca 20 Strings(VARCHAR) gespeichert.
In ca 50 anderen nur INT Werte.
Mit den int Werten werden nacher Berechnungen durchgeführt die dessen Ergebnis wiederum mit einem Wert aus der Tabelle verglichen wird und ggf. geupdated falls !=.
Die restlichen INT und VARCHAR Werte werden einfach nur zur Ausgabe (per echo oder print oder so.. ) benötigt.
mfg
Phil
Hallo,
Von den ca70 Spalten, werdn in ca 20 Strings(VARCHAR) gespeichert.
In ca 50 anderen nur INT Werte.
Was für Werte? Um das ganze komplett zu verstehen (und eine kompente Antwort zu geben) müßte man wissen was für Daten es genau sind. 70 Spalten sprechen eigentlich stark dafür, dass sich da noch was drehen läßt.
Die andere Frage die sich mir stellt, ist deine Herangehensweise an die Entwicklung deines Programms. Hast du einfach mit einer Idee angefangen zu programmieren und dir beim programmieren überlegt wie man dies und das löst? Oder hast du bevor du überhaupt eine Zeile Code geschrieben hast überlegt was du machen genau machen willst und wie du das ganze am besten machst?
Die nächste Frage wäre welches die Zielsprache für dein Projekt ist. Falls es sich um eine Sprache handelt, die Objektorientierung unterstützt solltest du dich erst mal mit Objektorientierung beschäftigen und zumindest wesentliche Aspekte in UML modelieren. In diesem Fall, wenn du eine objektorientierte Sprache verwendest kannst du dir event. sogar die Arbeit erleichern, indem eine fertiges Persistenz-Framework verwendest.
Früher habe ich übringens den gleichen Fehler gemacht, einfach drauf los programmiert. Mittlerweile ist mein wichtigstes Werkzeug für die Entwicklung von Software eine Bleistift und Papier ;-)
Gruß
Stareagle
Hi.
Was für Werte? Um das ganze komplett zu verstehen (und eine kompente Antwort zu geben) müßte man wissen was für Daten es genau sind.
Was genau meinst du mit was für Daten. Also
in dem Spiel kann man Level steigen in verschiedenen Fähigkeiten.
So, ich rufe z.B. die Seite "Stärke" auf so jetzt wird die Variable $stärke benötigt die den aktuellen Status enthält der vorher aus der DB geholt wurde. Dann klick ich auf den Link "Level steigen", ein Skript wird aufgerufen. Der Wert um eins erhöht und die entsprechende Zelle geupdated.
Das gleiche mache ich z.B. auch noch mit der Variable $intelligenz und $geld. Alle 3 werden ausgegeben, vorher aus der DB gesucht und bei "Level steigen" erhöht und wieder in die DB neu reingeschrieben.
Anschließend steht da ein "Gesamt-Level" was mit irgendeiner Formel aus den 3 Variablen berechnet wird. Die 3 Variablen haben alle den typ INT bzw. beinhalten nur INT Werte.
Ich hoffe damit ist die frage beantwort(wa sich aus irgendeinem unguten gefühl nicht glaube also was meisnt du genau mti "Daten") .
70 Spalten sprechen eigentlich stark dafür, dass sich da noch was drehen läßt.
Das denk ich mir komischerweise auch.
Die andere Frage die sich mir stellt, ist deine Herangehensweise an die Entwicklung deines Programms. Hast du einfach mit einer Idee angefangen zu programmieren und dir beim programmieren überlegt wie man dies und das löst? Oder hast du bevor du überhaupt eine Zeile Code geschrieben hast überlegt was du machen genau machen willst und wie du das ganze am besten machst?
Ich hab mir schon gedanken gemacht. Also wieviel Datenbanken ich brauche und wie bestimmte Sachen aufbauen und auf welche Tabellen darbei zugegriffen werden muss. Wie zm Beispiels PNs verschicken u.s.w. für solche Sachen hab ich andere Tabellen.
Die nächste Frage wäre welches die Zielsprache für dein Projekt ist. Falls es sich um eine Sprache handelt, die Objektorientierung unterstützt solltest du dich erst mal mit Objektorientierung beschäftigen und zumindest wesentliche Aspekte in UML modelieren. In diesem Fall, wenn du eine objektorientierte Sprache verwendest kannst du dir event. sogar die Arbeit erleichern, indem eine fertiges Persistenz-Framework verwendest.
Also ich kann folgendes benutzen:
PHP, Javascript, HTML, MySQL
Wobei ich das ganze per PHP und MySQL machen will.
Bei MySQL steht mir nur eine Datenbank zur Verfügung.
Früher habe ich übringens den gleichen Fehler gemacht, einfach drauf los programmiert. Mittlerweile ist mein wichtigstes Werkzeug für die Entwicklung von Software eine Bleistift und Papier ;-)
Die beiden Dinge lerne ich auch immer mehr zu schätzen gerade bei solchen Projektgrößen. Alle Idden sind aufgeschrieben und die Theoretischen Lösungen und Vorgehensweisen auch.
Ein wirklichen Tabellen/Datenbankmodell denk ich nicht, kann ich moment einfach nicht da ich nicht weiß wie ich das ganze besser löse.
Hoffe ihr könnt mir jetzt besser helfen.
mfg
Phil Z.
Hallo? :(
Hilfe!? :(
möP.
Phil Z.
Hallo Philipp,
Von den ca70 Spalten, werdn in ca 20 Strings(VARCHAR) gespeichert.
In ca 50 anderen nur INT Werte.
nein, die Datentypen interessieren zunächst weniger. Auch eine allgemeine Beschreibung, wofür
Mit den int Werten werden nacher Berechnungen durchgeführt die dessen Ergebnis wiederum mit einem Wert aus der Tabelle verglichen wird und ggf. geupdated falls !=.
die Daten später verwendet werden, ist wenig hilfreich.
Die restlichen INT und VARCHAR Werte werden einfach nur zur Ausgabe (per echo oder print oder so.. ) benötigt.
Tabellenstruktur mit etlichen Datensätzen und typischen Aufgabenstellungen dagegen sehr - aber unsere Glaskugeln, ob mit oder ohne SELFHTML-Logo, sehen sich leider außerstande uns diese Informationen zu liefern.
Freundliche Grüße
Vinzenz