PostgreSQL - porównywanie napływających danych ze stałymi danymi w bazie

0

Witam

od kilku dni testuję sobie PostgreSQL pod Windows (swoją drogą po wejściu w Pgadmin nie wiem czemu pojawia mi się zakładka w chromie a a nie w oddzielnej aplikacji)
Oprogramowanie jest ciekawe ale wymaga wielu komend, dlatego proszę was o pomoc.
Być może wskażecie lepsze rozwiązanie niż jakiś element mojej wizji.
Ok:
Stworzyłem sobie bazę danych z takimi oto wartościami:

CREATE TABLE Public."Prefix" (numer varchar(100), nazwa varchar(100), liczba varchar(100))

select * from Public."Prefix"

COPY Public."Prefix" FROM 'C:\Users\PC-KOMP\Downloads\NEW\01.tsv' DELIMITER E'\t';

treść pliku 01.tsv poniżej:

101 ania 510100
334 magda 584348
280 agnieszka 455899
116 ania 748555
055 tomek 655982
874 basia 254577
333 marek 113545
454 robert 638224
119 sylwia 447003

Ok, mam te dane w bazie w tabelach (Tables) pod nazwą "Prefix"
O ile te dane w tej tabeli "Prefix" są w miarę stałe to kolejne napływające dane do drugiej tabeli, które chcę importować mogą być inne lub czasami takie same.
Moim celem jest porównywanie pierwszej tabeli (a dokładniej kolumny nr 3 o nazwie "liczba" ) z kolejnymi importowanymi danymi, które będą się pojawiały w drugiej tabeli.
Aby zoptymalizować szukanie chciałbym pierwszą tabelę jakoś zindeksować aby była "pod ręką w ram" (żeby nie trzeba było ciągle ją przeszukiwać od nowa)
po to aby w trakcie importu do drugiej tabeli nowych danych, pierwsza tabela byłaby gotowa do porównania.

Oto zarys.

  1. Mam stałą pierwszą tabelę "Prefix"
  2. Kilka razy w tygodniu importuję nowe pliki csv lub tsv do drugiej tabeli o nazwie "Nowe"
  3. Chciałbym aby w trakcie każdego importowania do drugiej tabeli o nazwie "Nowe" PostgreSQL porównywał nowe dane z pierwszą tabelą (kolumną nr 3)
  4. Jeśli nie znajdzie podobieństw to ok a jeśli znajdzie jedno lub więcej to chciałbym aby mi to pokazał

PS. czy lepiej porównywać dwie różne tabele w obrębie jednej bazy, czy lepiej stworzyć dwie bazy z dwoma oddzielnymi tabelami?
PS2. jeśli można byłoby zindeksować pierwszą tabelę jakoś do ramu to czy porównywanie lepiej robić po imporcie czy właśnie w trakcie?
(chodzi mi o zachowanie szybkości procesu bez zbędnego czekania)

1

Jakiej wersji PostgreSQL używasz? 11, czy >9.6?
Jeśli 11, to prawie skazany jesteś na pgAdmin4 (który moim zdaniem jest gówniany), a który uruchamia się w Chrome, bo jest to "proteza" phpPgAdmin.
Jeśli niższa, to polecam pgAdmin3 (na 11 też da się z nim pracować, ale pewnych rzeczy nie widać).

A teraz do rzeczy. Zapomnij o trzymaniu tabel w RAM - jeśli nie masz w bazie pierdyliardów rekordów, a na pewno nie masz, to jest to zupełnie zbędne. Dobry index wszystko załatwi.
Nie wiem, czemu masz liczba varchar(100), ale to na pewno nie jest dobry pomysł. Zamień to na liczba bigint. Dodaj index:
create index on Public."Prefix"(liczba)
Dodawanie rekordów - to też zależy od wersji. Generalnie musisz poszukać hasła UPSERT - w 11 jest już zrobione, w 9.6 można napisac samemu.

0

Hej
akurat zainstalowałem wersję 10.5
Mogę zmienić na inną wersję, jaką polecasz?
z tym varchar to chodzi o ilość możliwych znaków w jednym rekordzie?
Nie wiem ustawiłem tak po prostu bo myślałem, że chodzi o tą ilość znaków.
A co z porównywaniem nowych rekordów z nowych plików?

0

Tak przy okazji, jeżeli kolumny "numer" oraz "liczba" to faktycznie zawsze liczba to użyj typu numerycznego, a nie tekstowego - np. integer, albo real:

https://www.postgresql.org/docs/10/datatype-numeric.html

Jeżeli nie chcesz aby pojawiały się te same rekordy, o tym samym numer, możesz albo stworzyć unikalny indeks który na to nie pozwoli generując błąd, albo lepiej - jakiś constraint lub trigger:

https://www.tutorialspoint.com/postgresql/postgresql_constraints.htm

https://www.tutorialspoint.com/postgresql/postgresql_triggers.htm

0
TomRZ napisał(a):

Tak przy okazji, jeżeli kolumny "numer" oraz "liczba" to faktycznie zawsze liczba to użyj typu numerycznego, a nie tekstowego - np. integer, albo real:

https://www.postgresql.org/docs/10/datatype-numeric.html

Jeżeli nie chcesz aby pojawiały się te same rekordy, o tym samym numer, możesz albo stworzyć unikalny indeks który na to nie pozwoli generując błąd, albo lepiej - jakiś constraint lub trigger:

https://www.tutorialspoint.com/postgresql/postgresql_constraints.htm

https://www.tutorialspoint.com/postgresql/postgresql_triggers.htm

Nie ogarniam, za dużo wątków a brak mi czasu na analizowanie komend itp :(
Wrzucam to zapytanie jako zlecenie, jeśli ktoś chce coś tam zarobić to zapraszam.

https://4programmers.net/Forum/Og%C5%82oszenia_drobne/337826-postgresql_zlece_stworzenie_podstawowej_bazy_danych_z_tabela_plus_listy_komend_do_porownywania?p=1663858#id1663858

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