Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: MySQL/PHP: id:t kuriin

Nesci [22.01.2009 18:12:57]

#

Eli tätä ongelmaa on nyt varmaan mietitty kaikilta mahdollisilta kanteilta: Jos taulussani on id (auto_inc) esittämässä rivi (järjestys) -numeroa esim 1,2,3,4 ja halutaan poistaa rivi nro 2. Jäljelle jää yllättäen 1,3,4.

Halutaan tuo ns. "haamu kakkonen" tuolta pois, ajettaisiin riveille 3 ja 4 jonkinlainen -1 lause. Saataisiin taas riveiksi 1,2,3 ja tietty auto_inc resettiin. Noh ei siinä ongelmaa, mutta jos rivejä onkin 5000. Ja epäilen, että kun tarpeeksi suuri määrä noita rivejä on niin php:llä ainakin jos alkaa uudelleen numeroimaan niitä niin timeouttia tulee.

Sen takia en halua jättää tuonne väliin näitä haamunumeroita, koska sitten vaikeutuisi rivien uudelleen järjestäminen. Eli kun rivit järjestetään tuon id:n mukaan niin jos riviin 2 kohdistaa ylöspäin siirron, riville 2 id=id-1 ja riville 1 id=id+1.

Eli onko jotain nopeaa keinoa myslissä vääntää numerot uusiksi, vai onko pakko muuttaa tuota rivien uudelleenjärjestämis scriptaa?

Lebe80 [22.01.2009 18:21:03]

#

eiks olis vaan parempi että id-numerot pysyis alkuperäsinä, ja tulostusvaiheessa vaan tulostaisit käyttäjälle numerojärjestyksessä välittämättä id-numeroista?

Ei noista "tyhjistä" väleistä pitäisi haittaakaan olla, ja uudelleen järjestäminen tuottaa melkovarmasti jatkossa enemmän haittaa kuin hyötyä.

Nesci [22.01.2009 18:25:58]

#

Eipä niistä haittaa kyllä olisi jos ei todella tarvitsisi uudelleen järjestystä, mutta sitä kun nyt tarvitaan mukamas niin paljon. Ja siinähän se ongelma nimenomaan onkin, ajattelin vain lähestyä toistakautta, koska se helpottaisi ja samalla selkeyttäisi taulua hieman kun mennää numerojärjestyksessä ilman reikiä.

Metabolix [22.01.2009 18:31:39]

#

Minusta vika on koko softan suunnittelussa, jos joudut tuollaisia miettimään. Käsitteenä id tarkoittaa jotain muista erottuvaa, eikä sitä ole tarkoitettu järjestyksen ylläpitämiseen. Järjestystä varten laittaisin siis aivan erillisen kentän, ellei sinulla ole aivan erityistä syytä olla tekemättä näin.

Rivien järjestemisessä taas voisit miettiä logiikkaa uudestaan. Otetaan rivi, jonka id = A. Olkoon numero on aluksi N ja lopuksi M. Oikeat kyselyt menevät näin:
M < N:

UPDATE taulu SET numero = numero + 1 WHERE $M <= numero AND numero < $N;
UPDATE taulu SET numero = $M WHERE id = $A;

M > N:

UPDATE taulu SET numero = numero - 1 WHERE $M >= numero AND numero > $N;
UPDATE taulu SET numero = $M WHERE id = $A;

Kyselyissä siis ensin siirretään yhdellä niitä, joiden numero sattuu olemaan rivin alku- ja loppupaikan välissä, ja sitten laitetaan rivi itse kohdalleen. Tähän tarvitaan id, koska rivin numero ei enää ole välttämättä ainoa lajiaan. (Toki olisi mahdollista käyttää riville väliaikaisesti toista numeroa, vaikkapa -1, ja tunnistaa rivi sen perusteella.)

Järjestys tietenkin onnistuu hakukyselyssä maagisilla sanoilla ORDER BY numero.

Grez [22.01.2009 23:33:23]

#

Todellakin ideana tuo ID:iden muuttaminen kuulostaa suunnilleen yhtä loistavalta, kuin että alettaisiin ihmisten henkilötunnuksia vaihtelemaan jos välistä sattuu joku kuolemaan.

acidi30 [26.01.2009 16:49:25]

#

Aika guruja te kyl ootte :D

punppis [28.01.2009 13:08:42]

#

Grez kirjoitti:

Todellakin ideana tuo ID:iden muuttaminen kuulostaa suunnilleen yhtä loistavalta, kuin että alettaisiin ihmisten henkilötunnuksia vaihtelemaan jos välistä sattuu joku kuolemaan.

'
Nyt lakiehdotusta eduskuntaan!

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta