Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Rekursiva querys - Hierarktisk datastruktur

Postades av 2009-09-02 13:41:24 - David Bergman, i forum mysq, Tråden har 3 Kommentarer och lästs av 8204 personer

Tjenare.

Googlat sönder internet i hopp om att hitta en smart lösning för att få rekursiva querys och hierarktisk datastruktur att gå ihop.

Exempel på hierarktisk datastruktur är ett träd med parent, child, grandchild-objekt, grandgrandchild etc. så kallad The Adjacency List Model:

Parent
Child
GrandChild
Child
GrandChild
GrandGrandChild
GrandChild

Detta är bra att kunna skapa om man gör ett kommenteringssystem där man kan svara på kommentarer. Alltså att alla objekt är kommentarer.

För att lagra detta så tänkte jag att Child har ett parent_id-attribut som pekar på ID:t till parent för detta objekt. Problemet är att mysql inte har stöd för hierarktisk data när det gäller querys. MSSQL och Oracle har stöd för detta. Med stöd så menar jag, att kunna lista trädet i rätt ordning.

Det enklaste sättet jag vet (efter eget testande) är att spara ett slags indenteringsnummer för varje inlägg där istället för ett parent_id så har man indentation_number. Exempelvis:

1 Parent
1.1 Child
1.1.1 GrandChild
1.1 Child
1.1.1 GrandChild
1.1.1.1 GrandGrandChild
1.1.1 GrandChild

Ex: Om man vill svara på kommentaren Parent så skickas 1 med, och Child lägger på 1 = 1.1
Vill man svara på Child så skickas 1.1 med och GrandChild lägger på 1 = 1.1.1
För att lösa problemet om vilket objekt som skall komma först i listan sorteras det på datum.

Detta system fungerar, men det är synd att behöva strukturera om allt vid byte av databas. Självklart kan man göra sorteringslogiken i applikationskoden (PHP, C#, etc) men enligt mina principer så ska databasen göra allt sånt arbete...

Min fråga efter detta långa inlägg: Finns det någon som har lyckats göra en mysql-query som kan presentera en Adjacency List (parent/child-träd) på rätt sätt? MySQLs egna förslag är helt åt skogen:
http://dev.mysql.com/tech-resources/articles/hierarchical-data.html

Har inte lyckats hitta någon best practice för detta vilket är kasst.


Svara

Sv: Rekursiva querys - Hierarktisk datastruktur

Postades av 2009-09-02 14:44:43 - Niklas Jansson

För det första: "Hierarkisk", inget "t".

Trädstrukturer har ju mängder med lösningar. Först och främst har du ju den vanliga;
ID, ParentID, OrderIndex, Info

Som har just det problemet du nämner - även om den är logisk när det kommer till att representera data och sätta in data är den hemskt ologisk när det kommer till att plocka ut data och ta bort data eller poster upp och ner.

I ditt fall låter du ju OrderIndex vara datum, och därmed är det lätt att ta bort och flytta enskilda poster.

Och då kommer vi ju till precis det du har konstaterat, att man kan behöva sortera grejerna i kod. Dina principer stämmer inte överens med mina - jag ser det inte som ett stort problem att ta ut det och hantera det i kod. Det beror ju på hur man vill visa det - ibland kanske man snarare vill ha hela grejen i datumordning och på något annat sätt indikera vilken som är parent?
Eller visa det som ett faktiskt träd, eller någon annan galen idé.

Själv föredrar jag att fylla objekt med informationen och sen mata ut dem.

MySQLs exempel behöver annars inte vara så dumt, det är ganska lätt att bygga upp sqlkoden dynamiskt så att man får ut det så.


Sen finns det ju vidare flera andra typer av strukturer. Har du ett fast maxdjup (vilket kanske inte är en så dum ide) kan du ju göra ett antal tabeller Comment1->CommentN (spontant känns det inte så snyggt men är egentligen rätt vetttigt)

Annars har du flera andra strukturer och hybrider. En klassisk som jag glömt namnet på har istället två räknare som "följer med trädet", och som ger trädet depth-first med en enda fråga.
(EDIT: modified preorder tree traversal alt. nested set model kallas det och finns också med under "The Nested Set Model" i det dokumentet du länkade till.)


Svara

Sv:Rekursiva querys - Hierarktisk datastruktur

Postades av 2009-09-02 17:32:39 - David Bergman

Stämmer bra det, hierarkisk ska det vara.

Jag ser det inte heller som ett stort problem att hantera det i kod men i detta fall känns det som ett nödvändigt ont.
Jag skulle inte säga att det beror på hur man vill visa det. En query för olika visningstyper, skulle jag göra. Självklart kan man göra det i kod. Alla är vi olika. :)

Att fylla objekt (eller inte) från en query ur en struktur likt "adjacency list"-modellen går utmärkt, då är det egentligen bara fler, mindre querys, som bildar trädet istället för en all-in-one. Lagrade procedurer som gör hela trädet åt en, och sköter sorteringen, går det med. Men lagrade procedurer har jag fått lite svårt för med tanke på att logiken följer databasen inte applikationen.

Jag får nöja mig med det jag har och jag tackar för svaret.




Svara

Sv: Rekursiva querys - Hierarktisk datastruktur

Postades av 2009-09-05 11:17:38 - Ola Lindfeldt

Från SQL Server 2005 kan man lösa många hierarkiska problem med CTE:s :)
Annars är väl det klassiska i detta fall två val:
- Stored proc som har en loop / en cursor som bygger upp en tmp-tabell i minnet
(det går väl även i MySql?)
- I kod bygga objektträd som redan har föreslagits


Svara

Nyligen

  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo
  • 14:25 Tips på verktyg för att skapa QR-k
  • 14:23 Tips på verktyg för att skapa QR-k
  • 20:52 Fungerer innskuddsbonuser egentlig

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 153
27 952
271 704
688
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies