![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 38 Pomógł: 5 Dołączył: 14.10.2012 Ostrzeżenie: (0%) ![]() ![]() |
Piszę sobie dysk internetowy, coś jak google drive. Pliki będą przechowywane na dysku, natomiast informacje o pliku takie jak jego nazwa i tak dalej będą przechowywane w bazie danych (w tabeli files). Jeden użytkownik ma mieć możliwość wrzucenia maksymalnie tylko np. 1 GB danych (administrator będzie miał możliwość konfiguracji, będzie można ustawić w pliku konfiguracyjnym ile maksymalnie miejsca na dysku może zająć użytkownik). Dodatkowo chcę mieć możliwość wyświetlenia użytkownikowi rozmiaru każdego pojedyńczego pliku. Aby to zrobić muszę gdzieś zapisywać rozmiar plików. Wpadłem na następujące rozwiązania:
1. Przechowuję rozmiar każdego pojedyńczego pliku w bazie danych jako integer (w bajtach) w tabeli files, aby sprawdzić ile miejsca zajmuje dany użytkownik to liczę sumę rozmiarów wszystkich plików danego użytkownika odpowiednim zapytaniem MySQL (SELECT SUM(size) FROM files WHERE uid = 69, gdzie uid to ID użytkownika, do którego należą pliki a size chyba nie muszę tłumaczyć). 2. Przechowuję rozmiar każdego pojedyńczego pliku w bazie danych jako string (np. 21 KB, 148 GB, 71,21 MB) w tabeli files i dodatkowo przechowuję sumę rozmiaru wszystkich plików danego użytkownika jako integer w bajtach, w tabeli users. 3. Nie przechowuję rozmiaru plików w bazie danych, natomiast pobieram ją za każdym razem za pomocą PHP korzystając np. z DirectoryIterator. Musiałbym wtedy pobrać z bazy danych wszystkie pliki, które należą do danego użytkownika a potem przejechać przez nie DirectoryIteratorem. Moim zdaniem bez sensu. Zastanawiam się, które rozwiązanie jest najbardziej optymalne i sensowne. A może macie jeszcze jakieś pomysły? |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 38 Pomógł: 5 Dołączył: 14.10.2012 Ostrzeżenie: (0%) ![]() ![]() |
Też uważam, że nr 3 jest bez sensu. Waham się między 1 i 2, wszystko zależy od tego ile w bazie danych zajmuje VARCHAR a ile INT, przy czym maksymalna liczba jaką można zapisać na UNSIGNED INT to 4294967295, co oznacza, że pojedyńczy plik mógłby mieć rozmiar tylko 4 GB bo więcej mi się w bazie nie zmieści. Musiałbym użyć BIGINT, który zajmuje 8 bajtów. Zatem przy opcji nr 1 mam kolumnę o rozmiarze 8 bajtów dla każdego pliku. Przy opcji nr 2 muszę zrobić kolumnę BIGINT w tabeli users, która przechowuje sumę wszystkich rozmiarów pliku w bajtach oraz kolumnę VARCHAR(9) w tabeli files, która przechowuje rozmiar pojedyńczego pliku wraz z jednostką (np. "999,99 MB"). Zatem mam kolumnę o rozmiarze 8 bajtów dla każdego użytkownika plus +-9 znaków dla każdego pliku. Bazę mam kodowaną w UTF8 i o ile się nie mylę 1 znak zajmuje 1 bajt, więc VARCHAR(9) zajmuje +- 9 bajtów. To chyba opcja nr 1 będzie najbardziej rozsądna. Dobrze myślę? Pytanie też jak długi byłby czas wykonywania zapytania SELECT SUM(size) FROM files WHERE uid = 69 przy dużej ilości rekordów.
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 5.10.2025 - 01:34 |