Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: SQL taulun suunnittelu

Munnu [09.09.2010 12:21:23]

#

tämä tuli vastaan tuossa eräänä päivänä ja hieman hämmästyin taulun rakennetta. Toimiva ratkaisu kyllä, mutta mitenkä voisi tehdä nopeammaksi.

CREATE TABLE `taulu` (
	`id` INT(11) NOT NULL AUTO_INCREMENT COMMENT 'Tunniste',
        `tauludataa' VARCHAR(100) NOT NULL COMMENT 'Tässä tulee paljon tietoa',
	`voim_paattyi` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'Päättymishetki tai korvaushetki'
	PRIMARY KEY (`id`, `voim_paattyi`)
)

eli DATETIME on osa primary keytä. Haut toimivat, että voim_paattyi on NULL aina kun rivi on aktiivinen ja poistetuissa voim_paattyi on sen hetken aika päivämäärällä. Näin saadaan tehty samaan tauluun historia sen rivin elämisestä kannassa.

DATETIMEä ei suositella käytettäväksi missään yksilöivänä avaimena. Syynä on sen oleminen tietotyypiltään FLOAT tyyppinen jossain sisäisessä rakenteessa ja aiheuttaa hämminkiä.

Olisiko kenelläkään antaa vinkkiä, mitenkä samanlaisen toiminallisuuden voisi järjestää ilman, että DATETIMEä käytetään primary_keynä.

Kun olen asiaa tuumaillut, niin yksi on käyttää historia taulua, johonka roudataan aina passiiviset rivit ja DATETIMEstä muodostetaan nanosekunnilleen stringi, jolla yksilöidään rivit. Tuo yksilöinti tapahtuu silloin kun taulu on luotu.

Muita innovatiivisia ideoita?

Metabolix [09.09.2010 15:18:16]

#

Yksinkertainen ratkaisu on lisätä tauluun TINYINT-sarake nimeltä aktiivinen ja käyttää tätä avaimessa ajankohdan sijaan. Toinen vaihtoehto on säilyttää tuossa taulussa vain uusinta tietoa (id, data) ja tallentaa historiatiedot eri tauluun, mikä voisi olla kannattavaa, jos muutoksia on odotettavissa paljon mutta hakuja historiasta vähän.

Munnu [10.09.2010 15:06:13]

#

tuo on kanssa hyvä ja toimiva vaihtoehto.

Nyt menee hieman yksityiskohtaisemmaksi. Onko tiedossa kumpi, alataulu (id,data) vai voim_paattyi:llä aikaleiman päivittäminen, on MySQL:ssä nopeampi tapa?

Vastaus

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

Tietoa sivustosta