symfony 1.1 admin generátor editálható primary key

2 views
Skip to first unread message

Hofferek Attila

unread,
Oct 14, 2009, 12:13:33 PM10/14/09
to symfo...@googlegroups.com
Ebben a problémakörben tudna valaki irányt mutatni? Tudom, hogy gyárilag
lehetetlen, de egy táblának mindenképpen kéne editálni az elsődleges
kulcsát! Előre is köszi!
--
Hofferek Attila

Tamas Amon

unread,
Oct 15, 2009, 10:30:53 AM10/15/09
to symfo...@googlegroups.com
Szia!

Miért kell editálni?

2009/10/14 Hofferek Attila <ho...@soka.co.hu>:
--
Ámon Tamás
Sent from Budapest, BU, Hungary

Hofferek Attila

unread,
Oct 15, 2009, 10:44:48 AM10/15/09
to symfo...@googlegroups.com
Tamas Amon írta:
> Szia!
>
> Miért kell editálni?

Miért ne? Hol van az leírva, hogy primary key csak integer autoincrement
oszlop lehet, és kőbe vésve? Miért ne adhatnám én meg, insert-kor? Vagy
lehet akár varchar is, nem? Vannak kocsijaim mondjuk egy táblában, egy
másikban meg útvonalak, kötve kocsi ID-hez. Szeretném felcserélni a két
kocsi útvonalát, hogy az egyik alatt látszódjon a másiké, és viszont.
Nem egy félmillió rekordos táblát akarok módosítani, gondolhatod...

János Krnák

unread,
Oct 15, 2009, 10:56:13 AM10/15/09
to symfo...@googlegroups.com
Csinalhatod azt, h az utvonal tabladban modositod a kocsi id-t.
Vagy irhatsz egy SQL-t es lefuttadhatod a peer classodon. Ami modositja a primary key-t a recordokon.

2009/10/15 Hofferek Attila <ho...@soka.co.hu>

Hofferek Attila

unread,
Oct 15, 2009, 11:01:49 AM10/15/09
to symfo...@googlegroups.com
János Krnák írta:

> Csinalhatod azt, h az utvonal tabladban modositod a kocsi id-t.

Ezt szeretnem elkerulni. Mennyivel jobb volna egy integert modositani,
mint szazezret.

> Vagy irhatsz egy SQL-t es lefuttadhatod a peer classodon. Ami modositja
> a primary key-t a recordokon.

Ezt reszletezned picit?

János Krnák

unread,
Oct 15, 2009, 11:06:55 AM10/15/09
to symfo...@googlegroups.com
Sztem ezzel megodlhatod:

Eloszor az elso id-t negativra allitod, v akarmire amilyen ID meg nem letezik, aztan a masodikat updateeled 1-re,
aztan a elso negativjat a masodik elozo id-jara.

De en nem tartom ezt elegans megoldasnak, mert ha mas tablad is van ami az autohoz kapcoslodik, azoknal is fel fog cserelodni a szulo.
En inkabb csinalnam azt, h ha utat akarsz cserelni akkor azt csereled.

$connection = Propel::getConnection(AutoPeer::DATABASE_NAME);

$update_1 = "UPDATE auto SET id = -id WHERE id = $id1";
$connection->executeUpdate($update_1);

$update_2 = "UPDATE auto SET id = $id1 WHERE id = $id2";
$connection->executeUpdate($update_2);

$update_3 = "UPDATE auto SET id = $id2 WHERE id = -$id1";
$connection->executeUpdate($update_3);


Udv
Janos

2009/10/15 Hofferek Attila <ho...@soka.co.hu>

Tamas Amon

unread,
Oct 15, 2009, 7:39:43 PM10/15/09
to symfo...@googlegroups.com
2009/10/15 Hofferek Attila <ho...@soka.co.hu>:

Szerintem az ID az olyan dolog, amiről nem is kell tudni. Az egy
dolog, ami egyedileg azonosítja a rekordot.

Te nem autó-t, hanem útvonalat akarsz módosítani, tehát az útvonalhoz
tartozó autó ID-t kell változtatni. Szerintem, ha ID-t kell
változtatni, az valahol adatbázis-tervezési hiba.

Persze az ID lehet más is, pld. users táblánál a felhasználónév, mert
az biztos egyedi, de én valamiért azt szeretem, ha minden táblában van
egy autoincrement id nevű mező. De talán ez csak elnevezési konvenció.

Hofferek Attila

unread,
Oct 16, 2009, 3:00:34 AM10/16/09
to symfo...@googlegroups.com
Tamas Amon írta:

> Szerintem az ID az olyan dolog, amiről nem is kell tudni. Az egy
> dolog, ami egyedileg azonosítja a rekordot.

Azt belsőleg elintézi az sql szerver, arról tényleg nem is tudsz, nem
kell neked még pluszban egy felesleges mezővel babrálni, ha amúgy nem jó
semmire.

> Te nem autó-t, hanem útvonalat akarsz módosítani, tehát az útvonalhoz

Ez szemantikai kérdés, én nem megyek bele, a marxista etika
eredménycentrikus, több út visz Nirvanába, mind Rómán át :-)

> tartozó autó ID-t kell változtatni. Szerintem, ha ID-t kell
> változtatni, az valahol adatbázis-tervezési hiba.

Hány példát hozzak neked, ahol mindenféle autoincrementes felesleges
mezők bevezetése nélkül jön ki a legmagasabb normálforma?

> Persze az ID lehet más is, pld. users táblánál a felhasználónév, mert
> az biztos egyedi, de én valamiért azt szeretem, ha minden táblában van
> egy autoincrement id nevű mező. De talán ez csak elnevezési konvenció.

Aha, aztán külön kell faragnod valamit, hogy a te kulcsod, ami nem az ID
mező, egyedi maradhasson. Miért nem lehet ezt simán megoldani, hogy az
az azonosító amit mondok.

Krisztian Ferenczi

unread,
Oct 16, 2009, 5:03:03 AM10/16/09
to symfo...@googlegroups.com
Biztos, hogy relációs adatbázisra van neked szükséged? Van egy autó, meg egy hozzá _tartozó_ útvonal. Ez a valóságban nem fog megváltozni, mert ahhoz az autóhoz tartozik és kész, miért kerülne át az útvonal egy másik autóhoz? Én is mindenhol egy auto incrementes ID-t használok, mert így a többi adat nyugodtan változhat. Pl a felhasználó tud felhasználónevet változtatni, anélkül, hogy ezt az apró változtatást az összes hozzáoszlásában vagy más, hozzá tartozó táblában is meg kellene tenni. Ha van egy autó, kaphat új rendszámot - mert előfordulhat! -, stb, stb...
Ha már program szinten, neked admin felületen kell lehetővé tenni, hogy ez az egyedi kulcs változtatható legyen, ott vmi tervezési hiba van, mert egy _relációs_ adatbázisnál ez egész egyszerűen nem fordulhat elő.

Ha meg igazából 1-2 alkalommal kell egy ilyen, akkor egyszerűen SSH-n vagy phpMyAdminon keresztül kiadsz egy UPDATE parancsot, amikor kell és kész. Az, hogy most több százezer sornak kell változnia, akkor mi van? Nem egészen értem, hogy milyen tábláid vannak és miért van neked erre szükséged, de ha jól sejtem, akkor: legyen egy útvonal tábla, egy autó tábla, meg egy útvonal pontok tábla. Ha változik egy útvonal, akkor csak egy helyen kell lecserélni az auto ID-t és kész. A módosításhoz persze kicsit szöszölnöd kell az adatbázisban, de csak egyszer kell megcsinálni.

A bővíthetőség szempontjából is aggályos az elképzelésed. Mert ha kitalálja a megrendelő, hogy neki kell egy másik tábla, az autókhoz megjegyzések fűzhetők, akkor már arra is figyelned kell, hogy ha változik egy autó ID-ja, akkor a hozzá tartozó megjegyzések táblában is végrehajtsd a módosításokat, mert lehet, hogy a 2-es kocsinak behorpadt az oldala, de ha azt te felcseréled a 4-essel, lesz ám káosz...

Chris

2009/10/16 Hofferek Attila <ho...@soka.co.hu>

Hofferek Attila

unread,
Oct 16, 2009, 7:59:10 AM10/16/09
to symfo...@googlegroups.com
Krisztian Ferenczi írta:

> Biztos, hogy relációs adatbázisra van neked szükséged? Van egy autó, meg
...

> az oldala, de ha azt te felcseréled a 4-essel, lesz ám káosz...

Rendben, elfogadom ezt az érvrendszert, minden szó igaz belőle. Most már
csak az nem tiszta, hogyha én szeretném meghatározni insert-kor, az
miért üldözendő? Miért kell annak szigorúan monoton emelkedőnek lennie?
És ha kitörlök elölről, vagy középről majd néhányat? Ugyanúgy nem lesz
folytonos.

Krisztian Ferenczi

unread,
Oct 16, 2009, 8:31:06 AM10/16/09
to symfo...@googlegroups.com
Egyáltalán nem kell, hogy folytonos legyen! Az egyediség a lényeg, aminél a legkézenfekvőbb, hogy folyamatosan növekvő számokat kapnak. Olyan esetben, ha én mégis szeretnék vmit beállítani, amiről holt biztos, hogy egyedi lesz VAGY gyorsítás miatt sorszámozni kell, akkor külön oszlopot hozok létre, és indexelem (előbbi esetnél unique)! Ennek praktikussági okai vannak. Nálam az egyedi azonosító mindig BIGINT, ennyi. Egyértelmű, konzekvensen használom, sose kell azon gondolkodnom, hogy akkor itt most VARCHAR(6) vagy VARCHAR(10) volt és mit kell adnom egy másodlagos kulcsnak. Használható, persze, mint akárcsak az is, hogy a programban nem kommentelek és egy, max kétkarakteres változóneveket használok. Nem tiltja semmi. De a hosszú évek alatt szerzett tapasztalatok alapján nem érdemes. Azt sem érdemes, hogy VARCHAR-os elsődleges kulcsot hozol létre. Nagyon kényelmes és sokszor jól jön, hogy az elsődleges kulcs egy "semmitmondó" szám, ami nem kapcsolódik az adott rekordhoz. Ha már te szeretnéd ezt beállítani, akkor vmilyen módon kapcsolódik hozzá, ha elsődleges kulcsot csinálsz belőle, akkor meg más táblákban is azt kell használnod és hiába beszédesebb, félre fog vinni előbb vagy utóbb. Mondom ezt úgy, hogy én pl egy 104 táblából álló rendszert kezelek, többmillió sorral, rengeteg több-több-több-több kapcsolattal. A korábbi programozó munkájából semmit nem tudtunk felhasználni, mert egyszerűen nem jól tervezte meg a feladathoz az adatbázist, nagyon is feladatspecifikusan állt neki, aztán mikor jött a megrendelő, hogy "kéne még bele ilyen, meg ilyen, meg ez is, meg az is", akkor nekiállt foltozgatni és ugyan "megoldotta" majdnem ugyanezt 10 táblából, olyan átláthatatlan és kezelhetetlen adathalmazt eredményezett, ami után neki egyszerűbb volt felmondani, mintsem vmi értelmeset kihozni...

A lényeg, hogy nagyban megkönnyíti az életed, ha magadra "kényszeríted" az auto incrementes elsődleges kulcsot és inkább hozzáadsz még egy oszlopot, amibe azt írsz be magadnak, amit akarsz, de ha kapcsolódik az adathoz egy másik tábla, akkor a számot használod.

Chris

2009/10/16 Hofferek Attila <ho...@soka.co.hu>

Reply all
Reply to author
Forward
0 new messages