|
| Design Fra : Morten |
Dato : 29-06-07 11:37 |
|
Hej. Jeg har en tabel users_in_groups der skal opdateres med en vis
frekvens, fex. 24 timer. Den indeholder en summation af relationer
mellem 2 andre tabeller, har man fex.:
table groups (id)
table users (id, group_id fk groups(id))
Så er indholdet af users_in_groups givet ved:
SELECT groups.name, groups.id, count(*)
FROM users, groups
WHERE users.group_id = groups.id
GROUP BY 1, 2
Problemstillingen her er en simplificering, den query der skal til er
ret dyr og der er ikke behov for et up-to-date resultat, hvorfor jeg
ikke vil køre den on demand. Men hvad så? Det er til MySQL - under
Oracle ville jeg benytte et materialized view.
Hvad gør man under MySQL 5? DROP/CREATE er lidt for farligt (og måske
for langsomt) da den applikation der bruger databasen vil regne med at
tabellen altid eksisterer.
Jeg har overvejet at have to users_in_groups tabeller, fex.
users_in_groups_odd og users_in_groups_event, og så have et view
users_in_groups som gør select * from users_in_groups_odd. På lige dage
populerer man så users_in_groups_even i baggrunden, og når man er færdig
laver alter view på users_in_groups view'et og sætter det til at pege på
users_in_groups_even, og omvendt for ulige dage. Hvis der er en smartere
måde vil jeg gerne høre om det.
Tak.
Morten
| |
Carsten Pedersen (29-06-2007)
| Kommentar Fra : Carsten Pedersen |
Dato : 29-06-07 13:16 |
|
Morten wrote:
>
> Hej. Jeg har en tabel users_in_groups der skal opdateres med en vis
> frekvens, fex. 24 timer. Den indeholder en summation af relationer
> mellem 2 andre tabeller, har man fex.:
>
> table groups (id)
> table users (id, group_id fk groups(id))
>
> Så er indholdet af users_in_groups givet ved:
>
> SELECT groups.name, groups.id, count(*)
> FROM users, groups
> WHERE users.group_id = groups.id
> GROUP BY 1, 2
>
> Problemstillingen her er en simplificering, den query der skal til er
> ret dyr og der er ikke behov for et up-to-date resultat, hvorfor jeg
> ikke vil køre den on demand. Men hvad så? Det er til MySQL - under
> Oracle ville jeg benytte et materialized view.
>
> Hvad gør man under MySQL 5? DROP/CREATE er lidt for farligt (og måske
> for langsomt) da den applikation der bruger databasen vil regne med at
> tabellen altid eksisterer.
>
> Jeg har overvejet at have to users_in_groups tabeller, fex.
> users_in_groups_odd og users_in_groups_event, og så have et view
> users_in_groups som gør select * from users_in_groups_odd. På lige dage
> populerer man så users_in_groups_even i baggrunden, og når man er færdig
> laver alter view på users_in_groups view'et og sætter det til at pege på
> users_in_groups_even, og omvendt for ulige dage. Hvis der er en smartere
> måde vil jeg gerne høre om det.
Hæld de nye data i users_in_groups_new, og så
RENAME users_in_group TO users_in_groups_old,
users_in_groups_old TO users_in_groups
Denne operation er atomisk (atomær?).
/ Carsten
| |
Morten (29-06-2007)
| Kommentar Fra : Morten |
Dato : 29-06-07 13:42 |
|
Carsten Pedersen wrote:
>
> Hæld de nye data i users_in_groups_new, og så
>
> RENAME users_in_group TO users_in_groups_old,
> users_in_groups_old TO users_in_groups
>
> Denne operation er atomisk (atomær?).
>
> / Carsten
Meget nydeligt! Tak.
Morten
| |
|
|