CronJob-Service
bei SELFPHP mit ...
|
+ minütlichen Aufrufen
+ eigenem Crontab Eintrag
+ unbegrenzten CronJobs
+ Statistiken
+ Beispielaufrufen
+ Control-Bereich
Führen Sie mit den CronJobs von
SELFPHP zeitgesteuert Programme
auf Ihrem Server
aus. Weitere Infos
|
:: Anbieterverzeichnis ::
Globale Branchen
Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP
:: Newsletter ::
Abonnieren Sie hier den kostenlosen
SELFPHP Newsletter!
|
MySQLi/PDO/(MySQL) Anfänger, Fortgeschrittene oder Experten können hier Fragen und Probleme rund um MySQLi/PDO/(MySQL) diskutieren |
20.10.2010, 11:58:20
|
Junior Member
|
|
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
|
|
AW: NESTED SETS in XML - Gruppierung von Elementen
Zitat:
Zitat von mr_sol
Bei der letzten Query hats einen Bug
C,C1 an falscher Position
G zu früh geschlossen
|
Stimmt leider, die Haupt-Tags der Sub-Elemente bekommen jetzt auch den flag-wert 3 und werden damit von CASE falsch verarbeitet.
Code:
+-----+------+----+------------+
| tag | flag | pt | desc |
+-----+------+----+------------+
| C | 3 | 4 | content C |
| G | 3 | 9 | content G |
Da muss ich noch mal drüber nachdenken.
Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
|
20.10.2010, 13:02:17
|
Junior Member
|
|
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
|
|
AW: NESTED SETS in XML - Gruppierung von Elementen
So, was ein kleiner Spaziergang in der Pause nicht so alles bewirkt...
Ich habe die Tabelle element um eine Spalte ebene_id (1 = Haupt, 2 = Sub ) erweitert, damit die Art der XML-Knoten wieder so klar getrennt ist, wie es mal war.
Code:
CREATE TABLE IF NOT EXISTS `tree` (
`id` int(11) NOT NULL,
`lft` int(11) NOT NULL,
`rgt` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- Daten für Tabelle `tree`
--
INSERT INTO `tree` (`id`, `lft`, `rgt`) VALUES
(1, 1, 16),
(2, 2, 3),
(3, 4, 13),
(4, 5, 12),
(5, 6, 7),
(6, 8, 11),
(7, 9, 10),
(8, 14, 15);
CREATE TABLE IF NOT EXISTS `element` (
`id` int(11) NOT NULL,
`tag` varchar(100) NOT NULL,
`desc` text NOT NULL,
`id_tree` int(11) NOT NULL,
ebene_id SMALLINT NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- Daten für Tabelle `element`
--
INSERT INTO `element` (`id`, `tag`, `desc`, `id_tree`, ebene_id) VALUES
(1, 'A', 'content A', 1, 1),
(2, 'B', 'content B', 2, 1),
(3, 'C', 'content C', 3, 1),
(4, 'D', 'content D', 4, 1),
(5, 'E', 'content E', 5, 1),
(6, 'F', 'content F', 6, 1),
(7, 'G', 'content G', 7, 1),
(8, 'H', 'content H', 8, 1),
(9, 'G2', 'content G1', 7, 2),
(10, 'G3', 'content G2', 7, 2),
(11, 'C1', 'content C1', 3, 2);
SELECT CASE r.flag
WHEN 1 THEN CONCAT( '<' , r.tag, '>', r.`desc` )
WHEN 2 THEN CONCAT( '</' , r.tag, '>')
WHEN 3 THEN CONCAT( '<' , r.tag, '>', r.`desc`, '</' , r.tag, '>')
END AS xml_teil
FROM (SELECT e.tag, 1 AS flag, t.lft AS pt, e.`desc`
FROM tree t
JOIN element e
ON e.id_tree = t.id
WHERE e.ebene_id = 1
UNION ALL
SELECT e.tag, 2 AS flag, t.rgt AS pt, e.`desc`
FROM tree t
JOIN element e
ON e.id_tree = t.id
WHERE e.ebene_id = 1
UNION ALL
SELECT e.tag, 3 AS flag, t.lft AS pt, e.`desc`
FROM tree t
JOIN element e
ON e.id_tree = t.id
WHERE e.ebene_id = 2
) r
ORDER BY r.pt, r.tag;
+---------------------+
| xml_teil |
+---------------------+
| <A>content A |
| <B>content B |
| </B> |
| <C>content C |
| <C1>content C1</C1> |
| <D>content D |
| <E>content E |
| </E> |
| <F>content F |
| <G>content G |
| <G2>content G1</G2> |
| <G3>content G2</G3> |
| </G> |
| </F> |
| </D> |
| </C> |
| <H>content H |
| </H> |
| </A> |
+---------------------+
19 rows in set (0.02 sec)
Könnte wieder stimmen.
Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
|
21.10.2010, 07:47:32
|
Anfänger
|
|
Registriert seit: Oct 2010
Alter: 58
Beiträge: 19
|
|
AW: NESTED SETS in XML - Gruppierung von Elementen
Morgen Thomas!
Als Morgenmensch habe ich mir deinen Vorschlag gerade durchdacht. Die Idee die Elemententabelle als Stack aufzubauen, liegt im Vermeiden jeglicher Zusatzinformation welche schon in der Tabelle vorhanden ist. Vielleicht denke ich hier zu sparsam.
Das schöne an Deiner Lösung ist, dass das System leicht erweiterbar ist. zB XML Attribute, Bewertung,....
Ich überlege gerade wie man die Performans der beiden Lösungen sinnvoll Testen könnte.
Was denkst Du?
Pseudocode für 1:
Code:
INSERT INTO tree (tag,desc,lft,rgt) VALUES ('Wurzel', 'content Wurzel', 1, 2);
SCHLEIFE ANZAHL DER TESTELEMENTE
rgt=ZUFALL zwischen MIN(lft) und MAX(rgt)
ZUFALL OBERELEMENT
UPDATE tree SET rgt=rgt+2 WHERE rgt >= $RGT;
UPDATE tree SET lft=lft+2 WHERE lft > $RGT;
INSERT INTO tree (tag,desc,lft,rgt) VALUES ('Zufalltext', 'content Zufalltext', $RGT, $RGT +1);
SCHLEIFE ZUFALL ANZAHL UNTERELEMENT
INSERT INTO tree (tag,desc,lft,rgt) VALUES ('Zufalltext', 'content Zufalltext', $RGT, $RGT +1);
SCHLEIFE END
SCHLEIFE END
grüsse helmut
Gutes Buch über Nested Sets: http://books.google.com/books?id=uw2...page&q&f=false
Geändert von mr_sol (21.10.2010 um 08:15:55 Uhr)
|
21.10.2010, 08:19:13
|
Anfänger
|
|
Registriert seit: Oct 2010
Alter: 58
Beiträge: 19
|
|
AW: NESTED SETS in XML - Gruppierung von Elementen
War über die Zeit...so der Rest
Code:
MAXELEMENTE=10000
ELEMENTE=0
INSERT INTO tree (tag,desc,lft,rgt) VALUES ('Wurzel', 'content Wurzel', 1, 2);
SCHLEIFE
$RGT=ZUFALL zwischen MIN(lft) und MAX(rgt)
ZUFALL OBERELEMENT
UPDATE tree SET rgt=rgt+2 WHERE rgt >= $RGT;
UPDATE tree SET lft=lft+2 WHERE lft > $RGT;
INSERT INTO tree (tag,desc,lft,rgt) VALUES ('Zufalltext', 'content Zufalltext', $RGT, $RGT +1);
ELEMENT=ELEMENT+1
SCHLEIFE ZUFALL ANZAHL UNTERELEMENT
INSERT INTO tree (tag,desc,lft,rgt) VALUES ('Zufalltext', 'content Zufalltext', $RGT, $RGT +1);
ELEMENT=ELEMENT+1
SCHLEIFE END
ABBRUCH ELEMENT>=MAXELEMENT
SCHLEIFE END
|
21.10.2010, 08:32:24
|
Junior Member
|
|
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
|
|
AW: NESTED SETS in XML - Gruppierung von Elementen
Hallo Helmut,
was für Performance möchtest Du messen?
a) Die Geschwindigkeit wie lange das Bearbeiten (INSERT,UPDATE,DELETE) dauert
b) Die Geschwindigkeit wie lange das Lesen (SELECT) dauert
Weiterhin ist mir noch nicht klar, ob die Tabelle nur ein "XML-Dokument" enthalten soll oder mehrere? Der bisherige SQL liest die Tabelle komplett aus.
Erzeuge Dir ein (PHP-)Skript, das eine große Menge an nachvollziehbaren Testdaten erzeugt. Dann läßt sich die Performance zu erkennen.
Je nach Anforderung müssen auch noch passende Indices erzeugt werden. Diese helfen MySQL beim Finden der Daten und beschleunigen die Abfrage.
Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
|
21.10.2010, 08:54:11
|
Anfänger
|
|
Registriert seit: Oct 2010
Alter: 58
Beiträge: 19
|
|
AW: NESTED SETS in XML - Gruppierung von Elementen
Hallo Thomas!
Du hast recht, habe nur die halbe Information von mir gegeben.
Die Geschwindigkeit wie lange das Lesen (SELECT) dauert ist mir wichtig. Der Pseudocode
dient ausschliesslich zum füllen der dB. Die Schreibgeschwindigkeit ist Nebensache.
Zitat:
Weiterhin ist mir noch nicht klar, ob die Tabelle nur ein "XML-Dokument" enthalten soll oder mehrere?
|
Das Ziel der kompletten Query und des Projektes ist eine Mindmap bei welcher mehrer Bäume miteinander verbunden werden unter Berücksichtigen der History. Ich wollte aus Übersichtlichkeit dazu einen neuen Thread anlegen. (Habe hinzu schon eine Lösung überlegt)
Da wir bisher zwei Lösungswege haben - ist die Frage ob der Performancetest erst mit Abschluss der Komplettlösung zu machen ist?
grüsse helmut
|
21.10.2010, 10:25:49
|
Junior Member
|
|
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
|
|
AW: NESTED SETS in XML - Gruppierung von Elementen
Zitat:
Zitat von mr_sol
Da wir bisher zwei Lösungswege haben - ist die Frage ob der Performancetest erst mit Abschluss der Komplettlösung zu machen ist?
|
Allgemein:
Performance sollte während des ganzen Projektablaufes bedacht werden. Aber trotzdem gilt:
a) Erst muss das Programm korrekt laufen
b) Dann kann man es schneller machen
Ein schnelles Programm das nicht korrekt funktioniert hat vermutlich weniger Akzeptanz als eines das zwar langsam ist, aber korrekt arbeitet.
Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
|
21.10.2010, 11:43:54
|
Anfänger
|
|
Registriert seit: Oct 2010
Alter: 58
Beiträge: 19
|
|
AW: NESTED SETS in XML - Gruppierung - Zusammenfassung
Zuerst möchte ich mich bei Dir bedanken, dass Du deine Zeit und SQL-Wissen zur Verfügung stellst.
Nochmals Danke für die Hilfe
Da die meisten Thread mit einem "ich kenne mich jetzt aus" ohne Zusammenfassung Enden, hier alles Notwendige für den Interessierten.
Grupperung von Nested Sets: Vorteil bei bei UPDATE da nicht der komplette Baum abgearbeitet wird. Bzw weniger Konflikte bei mehreren USER.
(besteht aus Oberelement/Unterelemente)
Lösung 1 (reine Lehre) mit Testdaten
Code:
CREATE TABLE IF NOT EXISTS `tree` (
`id` int(11) NOT NULL,
`tag` varchar(100) NOT NULL,
`lft` int(11) NOT NULL,
`rgt` int(11) NOT NULL,
`desc` text NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- Daten für Tabelle `tree`
--
INSERT INTO `tree` (`id`, `tag`, `lft`, `rgt`, `desc`) VALUES
(1, 'A', 1, 16, 'content A'),
(2, 'B', 2, 3, 'content B'),
(3, 'C', 4, 13, 'content C'),
(4, 'D', 5, 12, 'content D'),
(5, 'E', 6, 7, 'content E'),
(6, 'F', 8, 11, 'content F'),
(7, 'G', 9, 10, 'content G'),
(8, 'H', 14, 15, 'content H'),
(9, 'G2', 9, 10, 'content G1'),
(10, 'G3', 9, 10, 'content G2'),
(11, 'C1', 4, 13, 'content C1');
SET @a=0;
SELECT CASE flag
WHEN 1 THEN
IF(@a=t.lft,
CONCAT( '<' , t.tag, '>', t.`desc`,'<' , t.tag, '>'),
CONCAT( '<' , t.tag, '>', t.`desc`))
WHEN 2 THEN
CONCAT( '</' , t.tag, '>')
END AS xml_teil,
@a:=t.lft
FROM ( SELECT tag, 1 AS flag, lft AS pt, id
FROM tree
UNION ALL
SELECT tag, 2 AS flag, rgt AS pt, id
FROM tree
GROUP BY pt
ORDER BY pt,id) r
JOIN tree t
ON t.id = r.id
ORDER BY r.pt;
Lösung 2 (Trennen von baumstruktur und Content) mit Testdaten
(Oberelemente 1/Unterelemente2)
Code:
CREATE TABLE IF NOT EXISTS `tree` (
`id` int(11) NOT NULL,
`lft` int(11) NOT NULL,
`rgt` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- Daten für Tabelle `tree`
--
INSERT INTO `tree` (`id`, `lft`, `rgt`) VALUES
(1, 1, 16),
(2, 2, 3),
(3, 4, 13),
(4, 5, 12),
(5, 6, 7),
(6, 8, 11),
(7, 9, 10),
(8, 14, 15);
CREATE TABLE IF NOT EXISTS `element` (
`id` int(11) NOT NULL,
`tag` varchar(100) NOT NULL,
`desc` text NOT NULL,
`id_tree` int(11) NOT NULL,
ebene_id SMALLINT NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- Daten für Tabelle `element`
--
INSERT INTO `element` (`id`, `tag`, `desc`, `id_tree`, ebene_id) VALUES
(1, 'A', 'content A', 1, 1),
(2, 'B', 'content B', 2, 1),
(3, 'C', 'content C', 3, 1),
(4, 'D', 'content D', 4, 1),
(5, 'E', 'content E', 5, 1),
(6, 'F', 'content F', 6, 1),
(7, 'G', 'content G', 7, 1),
(8, 'H', 'content H', 8, 1),
(9, 'G2', 'content G1', 7, 2),
(10, 'G3', 'content G2', 7, 2),
(11, 'C1', 'content C1', 3, 2);
SELECT CASE r.flag
WHEN 1 THEN CONCAT( '<' , r.tag, '>', r.`desc` )
WHEN 2 THEN CONCAT( '</' , r.tag, '>')
WHEN 3 THEN CONCAT( '<' , r.tag, '>', r.`desc`, '</' , r.tag, '>')
END AS xml_teil
FROM (SELECT e.tag, 1 AS flag, t.lft AS pt, e.`desc`
FROM tree t
JOIN element e
ON e.id_tree = t.id
WHERE e.ebene_id = 1
UNION ALL
SELECT e.tag, 2 AS flag, t.rgt AS pt, e.`desc`
FROM tree t
JOIN element e
ON e.id_tree = t.id
WHERE e.ebene_id = 1
UNION ALL
SELECT e.tag, 3 AS flag, t.lft AS pt, e.`desc`
FROM tree t
JOIN element e
ON e.id_tree = t.id
WHERE e.ebene_id = 2
) r
ORDER BY r.pt, r.tag;
Links für Nested Sets
http://www.bittermonk.com/
http://joecelkothesqlapprentice.blog...?q=nested+sets
http://www.baoxuehao.cn/index.php/archives/484
http://www.klempert.de/nested_sets/
http://phpperformance.de/nested-sets...eume-in-mysql/
grüsse helmut
Ich würde mich freuen wenn Du mir noch bei Teil 3 meines Problem helfen könntest.
http://www.selfphp.de/forum/showthre...636#post138636
Geändert von mr_sol (21.10.2010 um 11:57:51 Uhr)
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 13:23:34 Uhr.
|