Mamy firmy. W firmie mamy ludzi. Każdy user może dodawać zasoby (czyli poprostu pliki).
Skrocona wersja bazy:
Tabela FIRMA
ID
NAZWA
Tabela USER
ID
ID_FIRM - id firmy do ktorej nalezy
IMIE
....
Tabela ZASOB
ID
ID_USER - id uzytkownika, ktory dodal zasob
SIZE - rozmiar w bajtach zasobu
....
I teraz tak:
Firma ma wykupiony jakiś pakiet, ktory mowi, że w ramach tego pakietu firma może zająć 300MB miejsca. Czyli 300MB zasobow mogą w sumie dodać uzytkownicy tej firmy. W przypadku, gdy te 300MB zostanie przekroczone, to dany user może dodać kolejne zasoby, pod warunkiem, że wykupi własny pakiet np. 100MB.
I tu pojawia się problem:
jak stwierdzić, że dany zasób ma już iść w ramach pakietu użytkownika?
Najprostsze rozwiązanie to takie, by dodawac do jakiegoś pola przy firmie, aktualny stan zasobow. Gdy to pole bedzie mialo wiecej niz 300MB znaczy, ze kolejne zasoby mają iść na konto uzytkownikow. Niestetu to rozwiązanie ma dużo wad, np:
1) Firma zmienia pakiet, podnosi z 300MB do 400MB. Wtedy już nie wiem, ktore zasoby userow będą się miescic w tym pakiecie a ktore nie
2) Dochodzi nowy user, ktory ma już jakąś pule zasobow. Powinny one wg. kolejnosci dodania wskoczyc w pule firmy, a tym samym z puli firmy wyprzeć inne zasoby aktualnych userow, dodane później
3) Odchodzi jakiś user, sytuacji podobna jak wyżej
4) Firma obniża pakiet i znowu podobnie jak w punkcie 1.
5) I pewnie jakieś inne losowe zdarzenia
Wydaje mi się, że powinno się zliczać na bieżąco (tudzież co jakiś czas) od początku aktualny stan zasobow w firmie i gdy ten stan został przekroczony, to dane nadwyzkowe zasoby wrzucac w pule konkretnego usera. Tylko jak znaleźć moment, od którego dane zasoby mają iść poza pulę firmy? Mam jedno zapytanie, ktore niestety do optymalnych nie nalezy, gdyż leci po wszystkich rekordach:
SET @akt=0; SELECT MAX(ID) FROM (SELECT @akt:=@akt+SIZE ak, ID FROM ZASOB WHERE @akt<300MB ORDER BY ID ASC ) podsel
To wersja uproszczona dla pokazania idei. Dzieki temu zapytaniu dostanę ID pierwszego rekordu, ktory nie miesci się już w puli firmy kazdy zasob wiekszy rowny temu ID ma byc naliczany na konto usera. Tylko jak już pisalem to leci po wszystkich rekordach.
Macie może jakieś inne zapytanie na rozwiązanie tego problemu? A może w ogole inny pomysł na przeliczanie tego wszystkiego?