Avatar billede lasse-p3 Nybegynder
04. januar 2008 - 17:27 Der er 39 kommentarer

Hvordan plejer man at gemme søgeord?

Jeg har en billedside. Mit spørgsmål er hvordan jeg skal gemme keywords i databasen. Skal jeg gøre det på følgende måde: Gemme dem i et indlæg og adskille ordene ved hjælp af komma således: keywords: summer,hot,weather,heat,ice cream. Eller hvordan plejer man at gøre?
Avatar billede jensgram Nybegynder
04. januar 2008 - 17:38 #1
Tror jeg ville gemme:

tags:
id, tag *** E.g. (1, summer), (2, hot) ...

imgs:
id, file, desc

imgs_tags_mm:
img_id, tag_id *** E.g. (1, 1), (1, 2) ...
Avatar billede jensgram Nybegynder
04. januar 2008 - 17:39 #2
På den måde kan du også oversætte keywords til andre sprog (hvis aktuelt), da du blot gemmer referencer til én tekst.

Det var dog bare ét forslag.
Avatar billede jakobdo Ekspert
04. januar 2008 - 17:41 #3
Ting der skal søges efter, er ikke godt at gemme i komma separeret liste.
Du bør gemme det sådan her:

billede_tabel
billede_id = 1
billede = noget.jpg

keyword_tabel
keyword_id = 1
keyword = summer

keyword_id = 2
keyword = hot

keyword_billede
billede_id = 1
keyword_id = 1

billede_id = 1
keyword_id = 2

osv..
Avatar billede jensgram Nybegynder
04. januar 2008 - 17:47 #4
Op. cit. ;)
Avatar billede lasse-p3 Nybegynder
04. januar 2008 - 18:02 #5
Hej Jens og Jakob. Jeg tror ikke helt jeg er med på jeres forklaring? Men det ser rigtigt ud. Kan i prøve at forklare lidt nærmere? PÅ forhånd mange tak
Avatar billede lasse-p3 Nybegynder
04. januar 2008 - 18:05 #6
VIl det sige at der skal oprettes et felt til hvert nøgleord der så får et id. Og når man mærker billeder bliver de gemt som f.eks. 1,3,5,8?
Avatar billede jakobdo Ekspert
04. januar 2008 - 18:07 #7
Hvis vi siger du har en tabel kaldet: IMAGES

Der gemmer du et billede, som så får et ID, lad os sige ID 1

Så har du en tabel med keywords.
ID 1 = summer
ID 2 = hot
ID 3 = weather

Og til sidst en tabel som kobler billeder og keywords sammen:

billede 1 og keyword 1
billede 1 og keyword 2
billede 1 og keyword 3

På den måde kan man se billede med ID = 1, har keywords summer, hot og weather.
Avatar billede lasse-p3 Nybegynder
04. januar 2008 - 18:17 #8
Hvordan fungere en krydstabel, hvis man kan kalde den det?
Avatar billede lasse-p3 Nybegynder
04. januar 2008 - 18:22 #9
Sådan ser min indsæt ud normalt når alle keywords kommer i et felt adskilt af komma:

mysql_query("INSERT INTO images (date, keywords, ) VALUES (NOW(), '$keywords', )") OR DIE(mysql_error());

Hvordan skal den se ud nu? JEg har oprettet en tabel ved navn keywords.. Det må være noget med at den skal lave en entry i keywords tabellen. Men hvordan finder jeg id på det nye entry og inkludere det i image-tabellens keyword felt?
Avatar billede lasse-p3 Nybegynder
04. januar 2008 - 18:23 #10
Smider lige nogle flere points ind..
Avatar billede jakobdo Ekspert
04. januar 2008 - 18:27 #11
Det bliver lidt mere "besværligt" at gemme keywords og få dem trukket ud.
Men det du skal gøre, er som sådan følgende:

Du skal indsætte alle keywords (du skal dog sørge for keywords kun bliver gemt EN gang hver)

Så trækker du ID ud på alle keywords og du trækker ID ud for det billede du netop lige har indsat.

Så laver du X antal inserts i "krydstabellen" eller også kaldt mange-til-mange tabel.
X = antal keywords.
Avatar billede lasse-p3 Nybegynder
04. januar 2008 - 18:35 #12
Puha det lyder svært, men jeg håber jeg kan få det til at virke. Kan du komme med et kodeeksempel eller er det for meget at forlange? Jeg smider gerne flere points ind..
Avatar billede lasse-p3 Nybegynder
04. januar 2008 - 18:38 #13
F.eks. hvordan er strukturen påmange-til-mangetabellen?
Avatar billede jensgram Nybegynder
04. januar 2008 - 18:41 #14
Hov - der var jeg ikke lige til stede. Jakob rammer vist ret præcist hvad jeg ville have svaret. Nogle gange kan det hjælpe at få samme ting forklaret på to måder, så jeg forsøger mig også:

Idéen er, at du har en tabel - lad os kalde den images - som indeholder én record pr. billede. Hvert billede identificeres unikt. For nemheds skyld antager jeg, at der er et id-felt:

images: id, file, desc

Hver record indeholder dog ikke data om keywords. De gemmes i en separat tabel - lad os kalde den (surprise) keywords:

keywords: id, keyword

Humlen er så, at en relationstabel knytter images-record med keywords-records via de to id'er:

images_keywords_mm: i_id, k_id
Avatar billede tobias_louv Nybegynder
04. januar 2008 - 18:41 #15
Må jeg lige høre, hvorfor der skal tre tabeller til, er det ikke nok med 1? Eller i hvert fald to.
Jeg kunne foreslå, at to tabeller ser sådan ud:

tabel 1:

id        billedenavn
1          etsummerbillede.jpg
2          etvinterbillede.jpg
3          endnuetbillede.jpg


tabel 2:

id        keywords        billede_id
1          summer          1
2          hot                1
3          ice cream      1
4          ice                2
5          snow              2
6          ski              2



Bare en idé, jeg synes det er noget rod med tre tabeller, og lidt overflødigt med de requests til databasen.
Avatar billede jensgram Nybegynder
04. januar 2008 - 18:42 #16
Relationstabellen skal blot indholde to felter: ID for hvert af de to tabeller.


E.g.

CREATE TABLE images_keywords_mm (
  i_id INT NOT NULL,
  k_id INT NOT NULL,
  KEY(i_id, k_id)
);

(utestet - jeg er lidt rusten i SQL)
Avatar billede lasse-p3 Nybegynder
04. januar 2008 - 18:49 #17
jensgram: din sql-viden virker ;-) Nu er tabellen oprettet. Hvordan bliver phpkoden så i praksis når jeg skal adde keywords?
Avatar billede jensgram Nybegynder
04. januar 2008 - 18:50 #18
Nu er jeg ikke sikker på, at nedenstående er korrekt, men håber, at det måske kan kaste lidt lys over, hvordan jeg tænker, at keywords kan udtrækkes for et billede. (Jeg føles, at jeg _virkelig_ er ved at dumme mig med utestede forespørgsler, men brug det hvis du kan :)


SELECT
  i.*, k.keyword
FROM
  images AS i
  LEFT JOIN
    images_keywords_mm AS mm,
    keywords AS k
  ON
    i.id = mm.i_id AND
    mm.k_id = k.id
WHERE
  i.id = [billed-ID]
Avatar billede lasse-p3 Nybegynder
04. januar 2008 - 18:50 #19
og lad os sige jeg adder keywords i en tekstboks og adskiller med komma..SKal teksten så ikke parses eller noget lignende? Synes jeg har hørt om det
Avatar billede tobias_louv Nybegynder
04. januar 2008 - 18:51 #20
Jeg må nok også lige skitsere idéen med én, selvom det nok er en smule fjollet:

id        keyword      billedenavn
1        hot          etsummerbillede.jpg
2        summer        etsummerbillede.jpg
3        ice cream    etsummerbillede.jpg
4        ice          etvinterbillede.jpg
4        snow          etvinterbillede.jpg
4        ski          etvinterbillede.jpg


....og her kan man også droppe id'er, så man kun har 1 tabel med to forskellige værdier. Dog vil dette nok blive lidt uoverskueligt..


Jeg må indrømme, jeg holder på at bruge to tabeller, for det gør det nemmere at tilføje keywords samt hurtigere at hente lortet ud fra databasen.
Avatar billede jensgram Nybegynder
04. januar 2008 - 18:51 #21
Det var til at trække ud.

Keywords knytter til billeder via

INSERT INTO images_keywords_mm VALUES ([billed-ID], [keyword-ID]);
Avatar billede jakobdo Ekspert
04. januar 2008 - 18:52 #22
Og nej, 1 eller 2 tabeller er ikke nok.
Hvis billede nummer 3 og har et keyword som summer, så skal der oprettes en keyword/images indsættelse:

image - 3 og keyword - 1
Avatar billede lasse-p3 Nybegynder
04. januar 2008 - 18:52 #23
Hehe jeg prøver virkelig at læse koden men det er som om jeg har bevæget mig ud et sted hvor jeg ikke helt kan bunde :-)
Avatar billede jensgram Nybegynder
04. januar 2008 - 18:53 #24
tobias_lou > Ja, jeg er tilbøjelig til at give dig ret, hvis det drejer sig om en lille billedmængde. Der er dog en grund til, at man normaliserer data i DB'er. Det sparer plads og DBMS'er er optimeret til at forespørge på den slags data. Det vil altid kunne gøres til genstand for diskussion.
Avatar billede tobias_louv Nybegynder
04. januar 2008 - 18:54 #25
Joh, men denne henvisning kan du jo lave direkte i tabellen med keywords, så hvorfor ikke bare gøre det?
Jeg kan ikke helt forstå, hvorfor man skulle gøre det på den anden måde med en ekstra tabel, der knytter de to sammen.
Avatar billede jensgram Nybegynder
04. januar 2008 - 18:54 #26
Håber I får løst problemet - evt. med en god diskussion som sidegevinst. Jeg kigger tilbage senere i aften eller i morgen. God aften.
Avatar billede lasse-p3 Nybegynder
04. januar 2008 - 18:55 #27
gemmes keyword-id'erne i et felt adskildt af komma?
Avatar billede jensgram Nybegynder
04. januar 2008 - 18:55 #28
Nej, der er netop ingen kommasepareringen. Én række pr. keyword pr. billede.
Avatar billede jensgram Nybegynder
04. januar 2008 - 18:56 #29
INSERT INTO images_keywords_mm VALUES (1, 1);
INSERT INTO images_keywords_mm VALUES (1, 2);

=>

noget.jpg er nu knyttet til hot og summer (jf. 04/01-2008 17:41:11)
Avatar billede tobias_louv Nybegynder
04. januar 2008 - 18:57 #30
Nåh, nu forstår jeg... Altså her taler vi om, at vi kun har DE keywords, der er brug for. Altså at summer ikke optræder flere gange.
Og så kæder vi dem sammen...

Smart! Det havde jeg sgu ikke tænkt på :P
Det er næsten mig, der skylder en omgang points, for her lærte jeg også lige noget :-)
Avatar billede lasse-p3 Nybegynder
04. januar 2008 - 19:01 #31
haha, fedt Tobias :-) Så mangler vi kun lige at jeg forstår ;-P

Jens: Jeg kan godt et eller andet tåget sted i min hjerne fornemme at det er rigtigt. Men hvordan gør jeg det rent praktisk i en upload og i en søgning hvor billederne skal findes? Det er et godt spørgsmål ;-)
Avatar billede tobias_louv Nybegynder
04. januar 2008 - 19:03 #32
Hmm, hvad er det helt præcist, du ikke kan finde ud af?

Punkter:
1. Du vil uploade billedet, og så tildele keywords?
2. Du kan ikke strukturere din sql på den måde, der skitseres?
3. Du kan ikke lave et script, der søger på dem?

Er det en eller flere af disse? :-)
Avatar billede lasse-p3 Nybegynder
04. januar 2008 - 19:09 #33
Strukturen er forståelig.
Jeg kan også godt finde ud af at uploade billeder ;-P
Men hvis jeg skriver i et tekstfelt: hot,summer,ocean,water. Så skal ordene vel adskilles på en måde indsættes i keywords databasen hvis de ikke allerede er oprettet og så skal billedet og keyword id på en måde tilknyttes...men jeg kan ikke se det for mig rent kodemæsssigt...
Avatar billede jakobdo Ekspert
04. januar 2008 - 19:13 #34
prøv at del tingene op.
Lav noget kode som gør del 1, del 2 osv...
Avatar billede tobias_louv Nybegynder
04. januar 2008 - 19:15 #35
( Først lidt sjov at deltage i to samtaler med dig samtidig jf. http://www.eksperten.dk/spm/813002 ) Du vil vist lave et uploadscript til billeder, hva? :P

MEN back to subjekt:
Altså når du modtager fra tekstfelt, sendt fra en form, kan du bruge explode til at skille keywordsne ad, fx med $keys_arr = explode(",", $_GET["keys"])
Ekselpel på input: "ice cream,hot,summer"
Avatar billede lasse-p3 Nybegynder
04. januar 2008 - 19:28 #36
Tobias: Jeg har lavet et uploadscript men jeg gjorde ikke brug af gd lib, og skulle derfor selv genere thumbnails og det ville derfor være skønt hvis jeg kunne få det til at virke automatisk.
Anyways tak for explode-hintet. Jeg må prøve mig frem ;-P
Avatar billede jensgram Nybegynder
04. januar 2008 - 22:33 #37
Husk i din keywords-tabel at sætte keyword-feltet til at være unikt.

Derefter ville jeg knytter keywords efter følgende opskrift:

* explode ved komma
* Gem alle ikke-eksisterende keywords i DB
* For hvert keyword: Opret relation ved at hente keyword-ID

Afhængigt af, hvor hård man er til SQL kan man nok gøre noget at det "smart". Så hård er jeg dog ikke :)
Avatar billede jensgram Nybegynder
04. januar 2008 - 22:45 #38
pkt. 3 kan MÅSKE gøres således:

INSERT INTO
  images_keywords_mm
  SELECT
    [billed-ID],
    k.id
  FROM
    keywords AS k
  WHERE
    k.keyword IN ('hot', 'summer')



IN-delen [('hot', 'summer')] kan du jo auto-generere...
Avatar billede tobias_louv Nybegynder
26. august 2009 - 21:17 #39
jeg synes, du bør lukke :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester