Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: archiwum zdjec - projekt bazy
Forum PHP.pl > Forum > Bazy danych > MySQL
wrebus
Witam,
zabieram sie za archiwum zdjec, i mam problem z projektem bazy.
oto co ma sie znalezc w bazie:

Płyty: nazwa_plyty, data_utworzenia
Zdjęcia: nazwa, autor, opis, plyta, klucze[], kategorie[]

i tu jest problem, bo kazde zdjecie ma w IPTC klika słów kluczowych jak i może mieć kilka kategorii. głównym zadaniem bazy jest wyszukiwanie zdjęć po kluczach i kategoriach, to tez trzeba brac pod uwagę. wstepny projekt tabeli zdjecia wyglada tak:

Kod
CREATE TABLE zdjecia (
    id,
    nazwa,
    id_autor,
    id_plyta,
    opis,
    klucze,
    kategorie )


przy czym krotka z kluczami wyglądałaby tak: "klucz1, klucz2, klucz3", tak samo z kategoriami.
to by jakiś sens miało, ale przypuszczam ze lepiej by to mozna bylo rozwiazac, np. dwie osobne tabele dla kluczy i kategorii (na pewno będą się powtarzać).

Kod
CREATE TABLE klucze ( nazwa, id_zdjecie )


napiszcie plz co o tym sądzicie.
Droopy
imho lepiej zrobić na dwóch tabelach...
wrebus
czyli druga wersja, ale wtedy też nie uniknę powtórzeń, np. jak bede mial dwa zdjecia z nastepujacymi kluczami: zdjecie1 (kobieta, rower, pies), zdjecie2 (kobieta, rower, wybory)

to tabela z kluczami wygląda tak:

klucz | id_zdjecia
============
kobieta | 1
rower | 1
pies | 1
kobieta | 2
rower | 2
wybory | 2

nie da sie jakos wyeliminowac tej nadmiarowosci?
SongoQ
Zamiast klucza typu kobieta, rower, ... trzymaj id klucza
hesus
Powtórzeń nie wyeliminujesz, bo relacja zdjęcia-klucze jest wiele do wielu.
W praktyce często stosuje się tablele powiązań:
  1. ZDJECIA (id_zdjecia, pozostale)
  2. KLUCZE (id_klucza, nazwa)
  3. KATEGORIE (id_kategorii, nazwa)
  4. ZDJECIA_KLUCZE (id_zdjecia, id_klucza)
  5. ZDJECIA_KATEGORIE (id_zdjecia, id_kategorii)

Dzięki takiemu rozwiązaniu można np:
- przenieść zdjęcie z jednej kategorii do drugiej nie usuwając kategorii,
- w prosty sposób zrobić wybór kategorii w programie obsługującym bazę.
wrebus
Teraz mam jeszcze jedno zadanie - optymalizacja zapytania wyszukującego:

  1. SELECT zdjecia.id, zdjecia.nazwa, zdjecia.id_plyta
  2. FROM zdjecia WHERE zdjecia.id IN (SELECT klucze_zdjecia.id_zdjecie
  3. FROM klucze_zdjecia WHERE klucze_zdjecia.id_klucz IN (SELECT id
  4. FROM klucze WHERE klucze.nazwa LIKE '%krowa%'))


wykonanie tego zapytania trwa 26 sek.exclamation.gif!!

mam w bazie 1300 zdjec, 160 kluczy i 2000 powiazan kluczy i zdjec.
moze cos poradzicie jak to lepiej napisac?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.