LTREE
Du er næsten på rette vej. Du faldt næsten over 'LTREE'-systemet til lagring af hierakiske data i en database. Du skal bare lave en lille ændring. det er alt.
Din tabel kan se sådan ud:
CREATE TABLE Table1
(`id` int, `parent_id` int, `name` varchar(13),
`path` char(10),
`money` int)
;
Og dine data kan se sådan ud.
(1, 0, 'company 1', '1', 10),
(2, 1, 'child 1', '1.1', 10),
(3, 2, 'child 2', '1.1.1', 10),
(4, 1, 'child 3', '1.2', 10,),
(4, 1, 'company 2', '2', 10),
(4, 1, 'child 2.1', '2.1', 10)
Stikolonnen hjælper med at identificere, hvilken virksomhed der er et datterselskab af en anden virksomhed. Bemærk, at du faktisk ikke behøver at have en allmoney
kolonne. Dette genereres dynamisk.
Og hvordan finder man alle de penge, der tilhører det første firma?
select sum(money) from Table1 where path >= '1' and path < '2'
Bemærk, at i den struktur, vi har oprettet, er barn1 forælder for barn2. Så hvordan finder vi pengene til barn1?
select sum(money) from Table1 where path >= '1.1' and path < '1.2'
Der er kun én forespørgsel og ingen rekursion.
MPTT
En anden populær tilgang til at hente hierarkiske data er at bruge Modified Pre Order Tree Traversal. Der har været en fremragende artikel om Sitepoint i mange år, hvilket forklarer, hvordan dette gøres med masser af prøvekode.