szuki
27.09.2012, 09:13:18
Witam, chciałbym zaczerpnąć rady w sprawie baz danych.
Napisałem pętlę, która sprawdza, który towar w sklepie został sprzedany. W efekcie otrzymuje numery ofert (sprzedanych) i wykonuję kolejną pętle by pobrać datę i ilość sztuk. Problem w tym, że nie chcę tych danych tylko wyświetlić, a zapisać dalej w bazie.
Jak w takim razie sensownie zapisać np:
5 szt | 15.09.2012 |
1 szt | 14.09.2012 |
2 szt | 13.08.2012 |
by móc swobodnie na tym operować (piszę ten skrypt by pobierać statystyki według daty, ilości sprzedanych itd)?
Lepiej zrobić jeden rekord z polem TEXT i tam wypisać dane (z separatorami), czy może lepiej zrobić relację:
numer_oferty | szt | data
i trzymać to w osobnej tabeli? Tylko te ostatnie rozwiązanie wydaje się być mało rozsądne przy większej sprzedaży.
Może ma ktoś lepszy pomysł?
b4rt3kk
27.09.2012, 09:24:03
Myślę, że nie ma sensu przepisywać już istniejących i myślę, że powiązanych ze sobą danych, wystarczy zastosować jedno zapytanie by je pobrać.
Załóżmy, że w jednej tabeli masz id towaru, a w drugiej id zamówienia, id towaru, liczbę sztuk oraz datę.
SELECT zamowienia.id_zamowienia, zamowienia.sztuk, zamowienia.DATA, towary.id_towaru FROM zamowienia INNER JOIN towary ON zamowienia.id_towaru=towary.id_towaru
Sephirus
27.09.2012, 09:39:46
dokładam się do opinii przedmówcy dodając, że można sobie zrobić z tego ładny widok, na którym potem można pracować
szuki
27.09.2012, 09:56:38
Cześć, dzięki za radę. Moje niedopatrzenie, bo nie zaznaczyłem, że informacje z drugiej pętli (tj. data, ilość szt.) są pobierane z innego serwera i "generowane w locie". Muszę najpierw je pobrać (co już robię) by sensownie zapisać i dopiero na nich operować.
Także zastanawiam się czy trzymać powiedzmy 6 dat/szt w jednym rekordzie, oddzielonych separatorami (np: 2012-09-25,1;2012-08-23,2;) czy każdą datę trzymać osobno - jako jeden rekord. Co będzie lepsze, jeżeli później będę chciał selectem pobrać wszystkie rekordy o określonej dacie?
Czy jeżeli będę trzymał dane w postaci csv, to muszę pobierać każdy rekord by sprawdzić czy jest w nim dana data, czy zwykłe zapytanie z selectem wystarczy?
Sephirus
27.09.2012, 10:00:36
Nie ma się co nad tym rozwodzić. Najlepsze rozwiązanie to skalowalne rozwiązanie w takich przypadkach bo nie do końca wiesz co potem można z tym robić (czasem wręcz można się kapnąć po zrobieniu tego że da się wyciągnąć jeszcze więcej). Zatem zrób oddzielny rekord dla każdego wpisu - nie baw się w CSV - to format zapisu plików a nie danych w bazie. Na danych wrzuconych w sposób standardowy można ładnie pracować, obrabiać je i wyświetlać dokładnie wg potrzeb - w przypadku CSV już sortowanie sprawiało by problem a co dopiero "Podaj mi ile sprzedano X dnia Y" - jak to wyciągniesz?

Co do drugiego pytania to w sumie zwykłe zapytanie wystarczy ale będzie o wiele mniej wydajne i gdy masz możliwość wyboru - nie ma się co zastanawiać - zalet rozwiązania NIE-CSV jest pełno a podaj mi jedną zaletę CSV?
szuki
27.09.2012, 10:09:39
Troszeczkę bałem się o wydajność przy wielotysięcznej liczbie rekordów, ale w sumie masz rację. Dobrze dobrane typy pól i powinno być ok nawet przy większej liczbie wpisów. Dziękuję za rady. Co do CSV, chyba żadnej.
Sephirus
27.09.2012, 10:34:35
Zapewniam Cię że przy skomplikowanych zapytaniach większą wydajność i tak uzyskasz bez CSV - bo pracujesz na konkretnym polach - więc jeśli oto chodzi to wybór też jest dobry.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę
kliknij tutaj.