ugrás a tartalomhoz

Postgresql triggerek

lorko · 2008. Dec. 23. (K), 01.12
Sziasztok,

a kérdés megoldásához úgy gondolom hogy triggerek használatára
lenne szükségem, de még ez a rész nem egészen világos számomra.

Amit szeretnék:
ha beszúrok egy új személyt az alábbi táblába
persons   //tábla neve
person_id | first_name | ...
----------+------------+----
  1       | Arthur     | ...

akkor szeretném ha létrejönne egy ilyen tábla
person_1   //tábla neve
message_id | subject | ...
-----------+------------+----
 ...       | ...     | ...

ha törlöm a személyt akkor törlődjön a hozzá tartozó tábla.

Segítségeteket előre is köszönöm.
 
1

Ezt így?

deejayy · 2008. Dec. 23. (K), 12.08
Ez a személyenként tábla megoldást milyen megfontolásból találtad ki?
2

Ez engem is érdekel. Lehet,

hector · 2008. Dec. 23. (K), 12.23
Ez engem is érdekel. Lehet, hogy valami twitter-szerű dolog lesz belőle, és így gyorsabb a juzerenkénti SELECT.

Egyébként valami ilyesmi lesz a megoldás:

CREATE OR REPLACE FUNCTION manage_user_table () RETURNS TRIGGER AS $$
BEGIN
    IF TG_OP = 'INSERT' THEN
        EXECUTE 'CREATE TABLE person_' || NEW.id || ' (message_id integer, ...)';
    ELSIF TG_OP = 'DELETE' THEN
        EXECUTE 'DROP TABLE person_' || OLD.id || ' CASCADE';
    END IF;
    RETURN NEW;
END;
$$ LANGUAGE 'plpgsql';

CREATE TRIGGER t_manage_user_table
AFTER INSERT OR DELETE ON persons
FOR EACH ROW EXECUTE manage_user_table();
4

tökéletes

lorko · 2008. Dec. 23. (K), 19.41
megint csak köszönöm, tökéletesen megy,
persze módosítottam hogy nekem megfeleljen.

Meg meg is értettem a trigger-ek lelkivilágát.

köszi.
3

azért van

lorko · 2008. Dec. 23. (K), 18.22
sziasztok

azért van persons tábla, mert tegyük fel van egy cég, vagy több cég, akkor így feltudom vinni az összes ott dolgozót, és van egy users tábla amihez hozzákötöm azokat akik tényleges felhasználók. Valamint egy person-höz (személyhez) több usert (felhasználót) tudok kapcsolni, például ha karban tartás van adminként lépek be, de napi munkához munkatársként.
Valamint így csak usert törlök, a person megmarad, így hozzá tudom kapcsolni milyen dokumentumot hozott létre a person, és még sorolhatnám miért is jó.

A segítséget köszönöm, ki is próbálom.
5

nem ezt kérdezték szvsz

Hodicska Gergely · 2008. Dec. 23. (K), 21.35
Nem a person tábla az érdekes, hanem, hogy mi értelme van minden usernek egy külön personX táblát fenntartani.
6

minden person-nek

lorko · 2008. Dec. 23. (K), 23.15
nem userenként van hanem person-önként, és azért mert úgy gondolom gyorsabb lekérdezni a person üzeneteit, ha külön táblába van tárolva minden egyes person-nek.
(Lehet nincs igazam, mert még ezen a téren kezdő vagyok.)
Valamint a jelenlegi keretrendszerbe ezt a legegyszerűbb beilleszteni.
7

ne tedd

Hodicska Gergely · 2008. Dec. 24. (Sze), 02.04
Ha csak sebesség aggályaid vannak, akkor ne tedd, egy index megoldja a problémád. Nagyon sok üzeneted kell legyen ahhoz, hogy érdemes legyen ilyesmiben gondolkodnod, de akkor sem emberenként érdemes külön táblát használnod, hanem valamilyen egyéb logika alapján. De még ha nagyon sok adatod van, üzenetek esetén valszeg az is elég lehet, ha a régi üzeneteket egy archív táblában tárolod.

Valamint a jelenlegi keretrendszerbe ezt a legegyszerűbb beilleszteni.
Mi az, amivel egy keretrendszer ilyen kényszert képez?
8

több ezer embernél?

lorko · 2008. Dec. 24. (Sze), 02.21
Ez egy nevező rendszerben lenne, és arra szolgálna hogy rendszer üzeneteket ebbe a táblába írnám, később a userek tudnának egymásnak üzenetet küldeni, mint egy kis belső levelező rendszer.
Én azért gondoltam hogy mindenki kap egy táblát hogy tényleg ne legyen gond a sebességgel, de ezen a téren nem vagyok szakértő (adatbázis kezelés) és egy hét alatt több más modult és funkciót kell integrálnom.
Tehát ha sok embernél azt mondjátok hogy később nem okoz problémát....?
Ezzel a modullal indul a rendszer tehát gyorsnak kell lennie.
9

nem gond

Hodicska Gergely · 2008. Dec. 24. (Sze), 03.36
Most hirtelen nem találtam arra limitet, hogy max. hány táblát lehet létrehozni postgresqlben, nem hiszem, hogy egészséges lenne ha van mondjuk 100000 táblád. Én első körben biztosan nem csinálnék ilyet, csak ha ténylegesen annyira sok üzenet van. Ráadásul postgresql tud feltételes indexet is, tehát tudsz mondjuk a person_id-ra tenni olyan indexet tenni, amiben mondjuk csak a nem olvasott státuszú sorok vannak benne.
10

hát rendben

lorko · 2008. Dec. 24. (Sze), 13.21
maradok az egy táblánál, és ha ténylegesen látszik az igény akkor keresek megoldást.
ebben az esetben meg tudom oldani hogy ha létrehozok egy új person-t az kapjon egy alap üzenetet.

Azért köszönöm Hector-nak a trigger-es segítséget, ami nem volt hiába mert azzal oldom meg az alapüzenet beszúrását, meg tanultam megint valamit.

Kösz mindenkinek.
11

trigger szerepe

Hodicska Gergely · 2008. Dec. 24. (Sze), 13.48
trigger ... azzal oldom meg az alapüzenet beszúrását
Az egy érdekes kérdés lehet, hogy mit tesz az ember triggerbe. Én személy szerint inkább olyan dolgokat tennék bele, ami az adatmodelledből származó kényszer. Az hogy egy új ember kap egy default üzenetet az nem ilyen, sima üzleti logika, lehet, hogy ezt szerencsésebb PHP oldalon tartani (már ha azt használsz).
12

igazad van

lorko · 2008. Dec. 24. (Sze), 15.08
igazad van, erre jutottam én is, pláne hogy több nyelvű a rendszer.
Még sok mindent tisztába kell tenni bennem rendszerfejlesztés terén,
azaz hogy mi az amit adatbázis szinten oldok meg, és mi az ami az üzleti logika része, és back-end dolga.