Structura baza de date filme,actori si genuri

Salut, am o idee de aplicatie ce implica urmatoarele chestii:

  • tabel cu actori (nume,data nasterii,etc)
  • tabel cu filme (titlu,an,etc)
  • tabel genuri (id,nume)

Acum as vrea sa fac o relatie intre actori -> filme si genuri. Ce vreau sa spun,este sa afisez: filmele in care au jucat actorii X si Y, cu genul Z.

Ceea ce ma duce cu gandul ca trebuie sa fac un tabel de relatie_actor_film (actID,filmID) si relatie_genuri_film (filmID,genID).

Acum, la cautarea dupa nume,se adauga: Jason Statham si Bruce Willis, as dori afisarea filmelor in care au jucat individual:

select from relatie_actor_film where actID=X OR actID=Y

Insa daca as vrea sa iau filmele in care au jucat impreuna?Inseamna sa scot intr-un array toate filmele cu X si Y,apoi sa le parcurg cu if(in_array( mergi mai departe... , insa mi se pare o tampenie.
Voi cum ati proceda?As dori si sa pun accent si pe viteza de procesare.Multumesc !

Ai încercat ceva de genul?

select id_film, oricealtcevavrei from tabel_distributie where id_actor IN (id_actor1, id_actor2) group by id_film having count(cevaindex) = 2

Evident, presupune din start că filtrezi după id-urile actorilor, deci dacă vei avea 2 rânduri returnate pentru același film, atunci e clar că joacă amândoi în el. Nu văd acum niciun scenariu în care nu ar fi valabilă logica asta.

PS: Ăstora care denumiți coloanele din baza de date cu CamelCase, cu prescurtări și alte prostii d-astea v-aș da drop la tot. :smiley: No offence! :smiley:

2 Likes

Ms, nu am incercat nimic.Prima data imi fac planul :smiley:

Haioasa aplicație. Când e gata s-o pui si pe forum pe aici.

Problema ta se mai poate rezolva strict în SQL printr-un join. Mai întâi selectezi toate filmele in care joacă X, apoi toate filmele in care joacă Y, si faci un inner join pe idul de film. În principiu e o intersecție între cele două seturi de rezultate, bazată doar pe filmId. În cod ar arata așa:

Select a.FilmId
From (select * from film_actori where actId=X) a
Join (select * from film_actori where actId=Y) b
On a.FilmId=b.FilmId

Join-ul în sine ar trebui să fie destul de cheap, ca o sa fie in memorie pentru seturi de date realistice (câteva sute de filme max pentru cei mai prolifici actori). Dar trebuie să ai un index pe actId în tabelul film_actori, altfel lookup-ul o să fie costisitor.

1 Like

Eu cred ca ar trebuii sa citesti mai mult despre SQL,ORM si DOCTRINE, mie unele idei solutii imi vin efectiv atunci cand programez ceva, deci pe moment.

Pentru ce vrei sa faci tu ar fi mult mai bine daca ai folosi ArangoDB sau Neo4J deoarece poti folosi grafuri si sunt o mana cereasca in acest caz.

Iti recomand sa citesti :
https://docs.arangodb.com/3.0/Manual/Graphs/index.html
O sa fie mult mai logic tot ce vrei sa faci cu grafuri, cu SQL logica e mai aiurea si nu e optima.

Ideea de baza e ca tu nu scrii din start query-uri ci iei o foaie si stabilești relațiile intre componente.

O să ajungi la nevoia de find shortest path ceea ce îți va stoarce creierii la SQL.

Puțin mai multă teorie pe ce vrei sa faci:
http://www.cs.dartmouth.edu/~gevorg/cs10/hws.php?hw=PS-5

Exact de ce ai nevoie la SQL http://www.webstepbook.com/supplements/labsection/lab9-sql/ (e un buton show all answers)

http://www.chartjs.org/ o fi mai bun decat https://docs.arangodb.com/3.0/Manual/Graphs/index.html ?

charts!!=graphs

Îți mulțumesc pentru că m-ai făcut să zâmbesc de dimineață. :slight_smile:

OnTopic: Eu nu aș recomanda unui începător utilizarea oricărei alte baze de date în afară de (My)SQL. Realist vorbind, sunt mult mai multe șanse să lucrezi zilnic cu așa ceva și e bine să te lovești de chestii d-astea mai ciudate ca să știi pe viitor de unde s-o apuci, cum e mai bine să construiești baza de date și ce poți face cu ea.

2 Likes

Multumesc tuturor,am sa analizez variantele si revin cu eventualele probleme/nelamuriri.

1 Like