konto usunięte

Temat: Problem z rekordami i kluczami w PostgreSQL

Witam,
mam mały problem z bazą danych PostgreSQL. Mam taką tabelkę:

CREATE TABLE dane (
id serial NOT NULL,
id integer,
id_modulu varchar(20),
czas timestamp without time zone,
dane1 real,
dane2 real,
PRIMARY KEY (id)
);


Różne urządzenia zapisują dane do tej tabeli... I bardzo często dane te są zdublowane (dochodzi do miliona rekordów dubli dziennie):/

Czy da się coś zrobić coś żeby się nie dublowało po stronie bazy?

Dubla rozpoznajemy po tym że: id_modulu, czas i dane1 są identyczne.

Aktualnie mam klucz założony na ID - może da się coś dodatkowego nałożyć na czas i id_modulu jednocześnie żeby zablokować ewentualne zdublowane wpisy?

W urządzenia nie mogę ingerować - muszę załatwić to po stronie bazy...

Wie ktoś może jak to zabezpieczyć?


Z góry dziękuje za pomoc,
Łukasz
Wojciech Sznapka

Wojciech Sznapka CTO @ STS Zakłady
Bukmacherskie

Temat: Problem z rekordami i kluczami w PostgreSQL

index unique

konto usunięte

Temat: Problem z rekordami i kluczami w PostgreSQL

a da się zrobić tak, żeby baza nie wywalała błędu?
Urządzenia się resetują przy otrzymaniu błędu...:/

Temat: Problem z rekordami i kluczami w PostgreSQL

Łukasz Peta:
a da się zrobić tak, żeby baza nie wywalała błędu?
Urządzenia się resetują przy otrzymaniu błędu...:/

W postgresie można zrobić procedurę i triggera, który przed każdym insertem sprawdzi, czy nie ma jakiegoś dubla i anuluje dodanie, ew. po każdym insercie wyczyści duble.

konto usunięte

Temat: Problem z rekordami i kluczami w PostgreSQL

a czy mógłbym prosić o chociaż jakąś przykładową funkcję/triggera na którym mógłbym się wzorować?

dziękuje bardzo za pomoc:)

Temat: Problem z rekordami i kluczami w PostgreSQL

Łukasz Peta:
a czy mógłbym prosić o chociaż jakąś przykładową funkcję/triggera na którym mógłbym się wzorować?

coś w ten deseń np (pewnie nieoptymalne, ale nic lepszego nie przychodzi mi na razie do głowy ;) ). nie testowałem, nie gwarantuje poprawności

Najpierw procedura (poprawka na plpgsql)


CREATE FUNCTION delete() RETURNS trigger AS
BEGIN
'delete from tabela where id_modulu = NEW.id_modulu and dane1 = NEW.dane1 and czas = NEW.czas;'
RETURN NEW;
END;
LANGUAGE 'plpgsql';


Później definiujemy właściwy trigger

 
CREATE TRIGGER duplikaty
BEFORE INSERT
ON tabela
FOR EACH ROW
EXECUTE PROCEDUTE delete();
Rafał Nowak edytował(a) ten post dnia 20.07.09 o godzinie 16:57
Kamil Szot

Kamil Szot PHP, JavaScript -
rozwiązywanie
problemów.
limeline.pl

Temat: Problem z rekordami i kluczami w PostgreSQL

Łukasz Peta:
Witam,
mam mały problem z bazą danych PostgreSQL. Mam taką tabelkę:

CREATE TABLE dane (
id serial NOT NULL,
id integer,
id_modulu varchar(20),
czas timestamp without time zone,
dane1 real,
dane2 real,
PRIMARY KEY (id)
);


Różne urządzenia zapisują dane do tej tabeli... I bardzo często dane te są zdublowane (dochodzi do miliona rekordów dubli dziennie):/

Czy da się coś zrobić coś żeby się nie dublowało po stronie bazy?

Dubla rozpoznajemy po tym że: id_modulu, czas i dane1 są identyczne.

Aktualnie mam klucz założony na ID - może da się coś dodatkowego nałożyć na czas i id_modulu jednocześnie żeby zablokować ewentualne zdublowane wpisy?

W urządzenia nie mogę ingerować - muszę załatwić to po stronie bazy...

Więc pewnie nie dałoby się zastąpić insertów wykonywanych przez urządzenia wywołaniem procedury składowanej która zawierała by bloki wyłapujący i ignorujący błąd:


BEGIN
INSERT INTO db(a,b) VALUES (key, data);
EXCEPTION WHEN unique_violation THEN
-- do nothing, and loop to try the UPDATE again
END;
Lukasz P.

Lukasz P. cascascacsasc

Temat: Problem z rekordami i kluczami w PostgreSQL

Jest to na jeszcze łatwiejszy sposób

1. Tworzysz index uniq, na pola unikalne (tylko nie id)
2. Zamiast insert into używasz replace into
3. Jeżeli w wartościach wpisywanych zostanie znaleziony inny rekord z takimi wartościami - zakutalizują sie pozostałe pola oraz pole autoincrement.
4. Zero błędów :)

Ale hmmm, to na pewno działa w mysql a czy w postrge będzie działać to nie wiem jestem pewien, ale powinno. W końcu tu i tu jest sql - jak to zastosujesz i sprawdzić daj znać bo sam jestem ciekaw :)
Kamil Szot

Kamil Szot PHP, JavaScript -
rozwiązywanie
problemów.
limeline.pl

Temat: Problem z rekordami i kluczami w PostgreSQL

Mateusz Żeromski:
Jest to na jeszcze łatwiejszy sposób

1. Tworzysz index uniq, na pola unikalne (tylko nie id)
2. Zamiast insert into używasz replace into
3. Jeżeli w wartościach wpisywanych zostanie znaleziony inny rekord z takimi wartościami - zakutalizują sie pozostałe pola oraz pole autoincrement.
4. Zero błędów :)

Ale hmmm, to na pewno działa w mysql a czy w postrge będzie działać to nie wiem jestem pewien, ale powinno. W końcu tu i tu jest sql - jak to zastosujesz i sprawdzić daj znać bo sam jestem ciekaw :)

Żeby tak jeszcze jeszcze Postgres obsługiwał REPLACE INTO...
Niestety nie ma tego, w którymś standardzie sql-a, a rzeczy, których tam nie ma twórcy Postgresa boją się tykać nawet dwumetrowym patykiem, choćby nie wiem jak by za nimi płakali ich użytkownicy.

A dla mysql-a jest po prostu INSERT IGNORE które robi dokładnie to o co pytającemu chodzi.

konto usunięte

Temat: Problem z rekordami i kluczami w PostgreSQL

Kamil Szot:
Niestety nie ma tego, w którymś standardzie sql-a, a rzeczy, których tam nie ma twórcy Postgresa boją się tykać nawet dwumetrowym patykiem, choćby nie wiem jak by za nimi płakali ich użytkownicy.

No juz bez falszywej propagandy.
Wydaje mi sie ze w standardzie SQL nie ma array'ow a jakos postgres je obsluguje dosc dobrze ;)
Kamil Szot

Kamil Szot PHP, JavaScript -
rozwiązywanie
problemów.
limeline.pl

Temat: Problem z rekordami i kluczami w PostgreSQL

Marcin Olichwirowicz:
No juz bez falszywej propagandy.

Napewno czasem coś palnę, ale w tym przypadku chyba niewiele się pomyliłem.
Wydaje mi sie ze w standardzie SQL nie ma array'ow a jakos postgres je obsluguje dosc dobrze ;)

http://farrago.sourceforge.net/design/CollectionTypes....

konto usunięte

Temat: Problem z rekordami i kluczami w PostgreSQL

Kamil Szot:
Marcin Olichwirowicz:
No juz bez falszywej propagandy.

Napewno czasem coś palnę, ale w tym przypadku chyba niewiele się pomyliłem.
Wydaje mi sie ze w standardzie SQL nie ma array'ow a jakos postgres je obsluguje dosc dobrze ;)

http://farrago.sourceforge.net/design/CollectionTypes....

W produktach komercyjnych jednak dominuje standard SQL92, a arraye lamia 1NF ;)

edit:
Nie mniej jednak, fakt - nie wiedzialem ze wrzucono arraye do tych nowszych standardow.Marcin Olichwirowicz edytował(a) ten post dnia 13.08.09 o godzinie 20:36

Następna dyskusja:

Problem z kluczami obcymi w...




Wyślij zaproszenie do