Idé til caching i Smarty

December 9, 2008 · Posted in Udvikling · Comment 

BedsteVen.dk viser jeg de seneste aktiviteter på forsiden. Det samme gør jeg på aktivitetssiden. Hver aktivitet indeholder en del databaseopslag. Eftersom min database-klasse som nævnt før automatisk gi’r mig en getFoo() og setFoo() hvis tabellen indeholder feltet foo. Valgte jeg at implementere noget simpelt caching på følgende måde:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{* Jeg har tilføjet et 'cache' felt i min aktivitetstabel *}
{assign var="cache" value=$activity->getCache()}
 
{if $cache}
 
  {$cache}
 
{else}
 
  {capture name=act}
    {* Her hentes og vises den enkelte aktivitet *}
  {/capture}
 
  {* Jeg viser det fangede indhold *}
  {$smarty.capture.act}
 
  {* Måske lidt grimt, men templaten kan også gemme indhold.
     Derfor gemmer jeg det genererede indhold her *}
  {$activity->setCache($smarty.capture.act)}
 
{/if}

EXISTS i MySQL

October 3, 2008 · Posted in Udvikling · Comment 

Jeg har tit en en-til-mange datastruktur når jeg fx arbejder med ting der har vedhæftet billeder. Det kan fx være på BedsteVen.dk, hvor brugerne kan have flere billeder på deres dyr eller annoncer.

På forsiden af BedsteVen.dk viser jeg nogle tilfældige dyr, men jeg vil kun vise de dyr der indeholder billeder. Min struktur er noget lignende (meget simplificeret):

Først tabellen med dyrene:

1
2
3
4
5
CREATE TABLE item (
    itemid INT UNSIGNED NOT NULL AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    PRIMARY KEY (itemid)
) ENGINE = MYISAM;

Så tabellen med billederne:

1
2
3
4
5
CREATE TABLE image (
    imageid INT UNSIGNED NOT NULL AUTO_INCREMENT,
    path VARCHAR(255) NOT NULL,
    PRIMARY KEY(imageid)
) ENGINE = MYISAM;

Til sidst tabellen der binder dyr og billeder sammen:

1
2
3
4
5
CREATE TABLE items_and_images (
    itemid INT UNSIGNED NOT NULL,
    imageid INT UNSIGNED NOT NULL,
    PRIMARY KEY(itemid, imageid)
) ENGINE=MyISAM;

Så hælder vi data i tabellerne:

1
2
INSERT INTO item (itemid, name) VALUES (1, 'Alfa'), (2, 'Beta'),
(3, 'Charlie'), (4, 'Delta'), (5, 'Echo'), (6, 'Foxtrot');
1
2
3
4
5
6
INSERT INTO image (imageid, path) VALUES
(1, 'images/001.png'), (2, 'images/002.png'),
(3, 'images/003.png'), (4, 'images/004.png'),
(5, 'images/005.png'), (6, 'images/006.png'),
(7, 'images/007.png'), (8, 'images/008.png'),
(9, 'images/009.png'), (10, 'images/010.png');
1
2
3
INSERT INTO items_and_images (itemid, imageid)
VALUES (1, 1), (1, 2), (1, 3), (1, 4), (2, 5), (2, 6),
(3, 7), (3, 8), (3, 9), (3, 10);

For at hente navnet ud fra item-tabellen på alle de rækker hvor den pågældende række var i items_and_images brugte jeg EXISTS, og SQL’en blev som følgende:

1
2
3
4
SELECT name FROM item
WHERE EXISTS (SELECT imageid FROM image
LEFT JOIN items_and_images AS iai USING(imageid)
WHERE iai.itemid = item.itemid);

Hvilket gav navnene: Alfa, Beta og Charlie :-)

Fidusen ved EXISTS er, at den returnerer true hvis dens argument returnerer rækker. Argumentet til EXISTS skal derfor være en subselection.


  • Om websmed.dk

    Jeg hedder Morten, og jeg har udviklet webapplikationer siden slutningen af 90'erne.

    Jeg vil her dele ud af min erfaring, og med jævne mellemrum poste nogle tips og tricks, samt løsningsforslag på generelle dagligdags problemstillinger.

    Jeg har en forkærlighed for PHP og MySQL, hvorfor I nok vil se flest indlæg der vedrører den gren af webudvikling.

    Jeg har en anden blog af mere personlig karakter på mbn.dk, hvor I kan finde kontaktmuligheder m.m.

    Mine indlæg vil tit være baseret på problemstillinger i mit daglige virke, eller i mit eget firma MRLYTICS, hvor jeg sælger kundeundersøgelser samt kundedatabaser.

    Denne side er hostet hos slicehost.

  • Skrevet på Twitter