konto usunięte

Temat: Problem z rekordami i kluczami

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

konto usunięte

Temat: Problem z rekordami i kluczami

UNIQUE (id_modulu, czas, dane1)

ALTER TABLE dane
ADD CONSTRAINT dane_my_unique_key UNIQUE(id_modulu, czas, dane1);

Oczywiście wtedy nigdy nie dodasz takiej samej kombinacji pól - przy takiej próbie baza zwróci błąd, sprawdź jak się zachowają w takim wypadku "urządzenia", które tam zapisują.

Po co jest "id integer"?Dariusz Ormicki edytował(a) ten post dnia 20.07.09 o godzinie 14:47

konto usunięte

Temat: Problem z rekordami i kluczami

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

konto usunięte

Temat: Problem z rekordami i kluczami

Łukasz Peta:
a da się zrobić tak, żeby baza nie wywalała błędu?
Urządzenia się resetują przy otrzymaniu błędu...:/
To jest bardzo głupi pomysł i baza się przed tym broni.
Mozna np. stworzyć triggera (wywoływać przed insertem wyzwalacz, który sprawdza, czy takie wartoiści się znajdują w tabeli, jeśli tak, spróbowac zrobić "silently-raise" poprzez np. RETURN 1; lub RAISE error_code - http://www.postgresql.org/docs/8.4/interactive/errcode... [successful_completion])Dariusz Ormicki edytował(a) ten post dnia 20.07.09 o godzinie 15:45
Błażej O.

Błażej O. Badania i rozwój
zaawansowanych
systemów
analitycznych

Temat: Problem z rekordami i kluczami

Proponuję zrobić jakoś tak (musisz trochę pokombinować):
1. Tabelka "dane" - schemat tabeli jak w poście
2. Tabelka "dane_duble" - schemat tabeli jak w poście tabeli "dane"
3. Utworzyć regułę (CREATE RULE ...) tak aby dobre dane lądowały do tabeli "dane" a duble do tabeli "dane_duble".

i tyle - teoria w miarę prosta praktyka jak zwykle się okaże czy prosta czy też nie - opis dotyczący reguł w postgresql jest tu:
http://www.postgresql.org/docs/8.4/static/sql-createru...

Pozdrawiam
Błażej
Robert Suski

Robert Suski Sr Solutions
Developer

Temat: Problem z rekordami i kluczami

Pomysł z triggerem, jak kolega wspomniał to delikatnie mówiąc średnie rozwiązanie (jak masz przeszlo milion insertów dzienne) no to wyobraź sobie że przed każdym insertem bedzie trigger, normalnie rzeźnia :).
Pomysł z regułą też średni no chyba że w jakiś magiczny sopsób będzie sprawdzał czy to co wstawiasz to dubel (bo jak przy każdym insercie masz przejrzeć całą tabelę no to znowu rzeźnia :)).

Co to za urządzenia? Przez co się łączą? Może da się to zrobić poprzez zmianę poziomu logowania po stronie klienta, ale pewnie dużo zależy od tego co to za urządzenia (możliwe że plotę głupoty :) ).

konto usunięte

Temat: Problem z rekordami i kluczami

Robert Suski:
Pomysł z triggerem, jak kolega wspomniał to delikatnie mówiąc średnie rozwiązanie (jak masz przeszlo milion insertów dzienne) no to wyobraź sobie że przed każdym insertem bedzie trigger, normalnie rzeźnia :).
Pomysł z regułą też średni no chyba że w jakiś magiczny sopsób będzie sprawdzał czy to co wstawiasz to dubel (bo jak przy każdym insercie masz przejrzeć całą tabelę no to znowu rzeźnia :)).

Co to za urządzenia? Przez co się łączą? Może da się to zrobić poprzez zmianę poziomu logowania po stronie klienta, ale pewnie dużo zależy od tego co to za urządzenia (możliwe że plotę głupoty :) ).
Praktycznie większość rozwiązań bez ingerencji w miejscu obsługi tego zdarzenia (dodawanie/obsługa wyjątki zgłoszonego przez bazę) to jak powiedziałeś "średnie rozwiązanie" ;-) Tym bardziej że nie wiemy nic co tam piszczy po stronie klienta.

konto usunięte

Temat: Problem z rekordami i kluczami

urządzenia to takie specjalne nadajniki, które wysyłają dane do serwera i zapisują w bazie danych - w nie nie mogę ingerować, bo nawet nie mam jak :(

czyli trigger zły, ale nie ma nic lepszego?
Robert Suski

Robert Suski Sr Solutions
Developer

Temat: Problem z rekordami i kluczami

Co byś nie zrobił po stronie bazy powinno sprawdzać czy coś co wstawiasz jest dublem (no chyba że da się to zrobić tym poziomem logowania, zmusić aby baza nie odpowiadała klientom błędami). No to pomyśl jak spadnie wydajność jeśli takie sprawdzanie będzie przed każdym insertem.
Marcin Badtke

Marcin Badtke Administrator Baz
Danych, Citibank
Europe plc

Temat: Problem z rekordami i kluczami

O ile dobrze rozumiem - urządzenia muszą zrzucać dane jak zrzucają i trzeba wymyślić mechanizm bazodanowy eliminujący duplikaty na trzech wymienionych kolumnach.

A może stworzyć procedurę storowaną, która będzie ładować dane do tabeli z unikalnym indeksem ? Gdy insert się nie powiedzie to przechwyci błąd i go zignoruje.

Następna dyskusja:

phppgAdmin - problem z logo...




Wyślij zaproszenie do