Kilka osobnych baz w plikach CSV do jednej bazy MySQL

0

Mam pytanie co kilkanaście dni mam otrzymywać z kilku sklepów ich bazy z produktami (każdy sklep buduje mi bazę w CSV schemat taki sam), ale jak to zautomatyzować aby jakoś w miarę łatwo takie bazy aktualizowć i w miarę automatycznie? Mogę napisać skrypt, który odpalam, wskazuję jaki sklep aktualizuję i skrypt wrzuca do bazy zawartość pliku, ale może łatwiej to zrobić przez crona, odpala się skrypt, i po kolei bierze wrzucone pliki na serwerze z katalogu (np. pliki 10 sklepów) i po kolei dodaje do bazy. Np. 1.csv dodaje do bazy jako sklep 1.csv, potem bierze 2.csv i dodaje do bazy jako sklep 2, ale czy dobrze kombinuję?

Drugie pytanie mam te 10 sklepów, i kiedy ich asortyment z plików csv wczytam do swojej bazy będę mógł wyszukiwać produkty i prezentować informacje o produktach na stronie gdzie w jakich sklepach dane produkty się znajdują. Pytanie tylko czy jeśli co ileś dni muszę wywalić stary asortyment z bazy i wczytać nowy, który jest aktualny to powinienem bazę zaprojektować tak, że każdy sklep w oddzielnej tabeli czy wrzucać wszystko do jednej tabeli? Wydaje mi się, że każdy sklep w osobnej tabeli jest najlepszym rozwiązaniem, ale może źle myślę.

Ostatnie pytanie czy wrzucenie z pliku csv, który zawiera np. 100 tys. rekordów będzie procesem czasochłonnym czy jednak taki update sprawnie poleci?

0

Odpowiem Ci z doświadczenia bo sam mam uzupełnianie danych w bazie z pliku csv.
Ja używam postgresql i on całkiem fajnie sobie radzi z plikami CSV przy użyciu string_to_array i unnest przykład:

select w, row_number() over () as rn
                    from (select string_to_array(unnest(string_to_array('Numer;Dzien;Miesiac;Rok;L1;L2;L3;L4;L5;L6
1;27;1;1957;45;43;39;31;12;8
1;28;1;1957;23;42;11;1;32;5', E'\n')), ';') w) l
                   where w <> '{}'

i w zasadzie ja mam to zrobione tak, że stworzyłem sobie w plpythonu (taki dodatkowy "język" w postgresql umożliwiający tworzenie skryptów w pythonie) skrypt, który "ściąga" ze strony dane i zapisuje w postaci CSV w returnie zwracając np to co podałem w skrypcie jako stringa. Cały myk polega na tym, że w CRON zrobiłem cyklicznie uruchomienie procedury z bazy danych, która przy użyciu pythona ściąga dane i ładuje do tabelek oczywiście sprawdzając czy dany rekord się nie dubluje itd.

Co do drugiego twojego pytania czy lepiej 10 tabel czy 1 ... to już zależy od tego czy planujesz rozwijać o kolejne sklepy jeśli tak to każdy sklep = nowa tabela ... dość kłopotliwe natomiast w jednej tabeli robisz produkty + indentyfikator sklepu i załatwione.

Ja pobieram setki tysięcy rekordów z CSV i trwa to chwilkę bo mam dobrze zoptymalizowaną bazę, z resztą jak będziesz to robił z crona to nie powinno ci robić różnicy czy wykona się to w sekundę czy 10 min :)

PS. Jeszcze taki przykładzik rozwinięty do poprzedniego z użyciem funkcji sort:

select id, "data", liczby, ll[1] l1, ll[2] l2, ll[3] l3, ll[4] l4, ll[5] l5, ll[6] l6
    from (select w[1]::int id, (w[4]||'-'||w[3]||'-'||w[2])::timestamp "data", 
                 array[w[5]::int, w[6]::int, w[7]::int, w[8]::int, w[9]::int, w[10]::int] liczby, 
                 sort(array[w[5]::int, w[6]::int, w[7]::int, w[8]::int, w[9]::int, w[10]::int]) ll
            from (select w, row_number() over () as rn
                    from (select string_to_array(unnest(string_to_array('Numer;Dzien;Miesiac;Rok;L1;L2;L3;L4;L5;L6
1;27;1;1957;45;43;39;31;12;8
1;28;1;1957;23;42;11;1;32;5', E'\n')), ';') w) l
                   where w <> '{}') l
           where rn > 1
           order by rn desc) l

1 użytkowników online, w tym zalogowanych: 0, gości: 1