Witamy na forum PC Format Zapraszamy do REJESTRACJI


Użytkownicy przeglądający ten wątek: 1 gości

Schemat bazy danych mysql - baza filmów

#1
Schemat bazy danych mysql - baza filmów
Potrzebuję rady jaką strukturę tabel stworzyć. Aplikacja będzie wyświetlać podstawowe informacje o filmie (reżyser, tytuł, długość filmu), do tego też potrzebuję gdzieś trzymać obrazy z filmu. Gdzie je mogę zapisywać? Jakie tabele trzeba stworzyć? Czy tworzyć oddzielną tabelę z aktorami? Jeśli tak, to jak je połączyć z filmami, który aktor grał w którym filmie?
 System operacyjny: windows_eight Przeglądarka: chrome
#2
RE: Schemat bazy danych mysql - baza filmów
Obrazy trzymaj na serwerze a w bazie linki do nich. A co do samej bazy to twoja twórczość. Poczytaj o zasadach normalizacji baz danychOczko
 System operacyjny: windows_seven Przeglądarka: firefox
#3
RE: Schemat bazy danych mysql - baza filmów
(06.06.2016, 21:17)dzikuu86 napisał(a): Obrazy trzymaj na serwerze a w bazie linki do nich.
To bardzo zależy od konkretnego rozwiązania. Oczywiście, przechowywanie w bazie ścieżki zamiast pliku jest jedną z możliwości. Czasami sytuacja wymaga, by w bazie był cały plik, np. przechowywany jako dane binarne (blob).
Autorze, skoro przychodzisz z takim zadaniem, to prawdopodobnie musiałeś liznąć trochę podstaw baz danych. Chętnie Ci pomogę, ale nie bardzo widzi mi się robienie wszystkiego za Ciebie. Pokaż co wymyśliłeś, to pomożemy.
 System operacyjny: windows_seven Przeglądarka: firefox
#4
RE: Schemat bazy danych mysql - baza filmów
Czy konieczne jest zawsze ustawiać długość String'a?
Kiedy używać typu text?
Czy linki trzymać w typie varchar?
Długość filmu ustawiać na typ time?

FK dodały się automatycznie jak dodałem referencje (te pod kreską). Czy one wszystkie są potrzebne? Czy w związku z tym, że np. w Filmy dodany został FK Aktorzy_ID_Aktora, mogę usunąć Rezyser, którego sam utworzyłem? Analogicznie, resztę dublujących się też? 

Zakładając, że chciałbym zrobić taką głupią rzecz, jak zaznaczanie w bazie danych czy film miał napisy końcowe, czy tabela Napisy jest dobrze skonstruowana? Czy kolory mając typ bool można robić NULL, czy to już jest bez sensu skoro można ustawić false?(to czysto techniczne pytanie, nie będę czegoś takiego tworzył)

Aktorzy grają w wielu filmach i w każdym filmie jest wiele aktorów. Co w przypadku, gdy Jan Kowalski grał w filmie A i B, jak wpisać to do bazy? Czy potrzebna jest tabela pośrednicząca w sytuacji wiele do wielu?

W swojej aplikacji zapytania wykonuję przez skrypt php. Zwraca on wynik w json'ie. Czy taka metoda jest bezpieczna?
[Obrazek: 1vsEL7Z.png]
 System operacyjny: windows_eight Przeglądarka: chrome
#5
RE: Schemat bazy danych mysql - baza filmów
1. Nie ma typu String.
2. Typu TEXT używasz dla bardzo dużych tekstów (zazwyczaj więcej niż kilkadziesiąt tysięcy znaków)
3. Tak - typ varchar nadaje się do krótkich tekstów (np linki, imię, nazwisko, nazwy filmów, krótkie opsiy)

Resztę sprawdzę jak odczytam załącznik.

Długość filmu zazwyczaj jest podawana jako liczba minut, dlatego wygodniej będzie użyć do tego typu liczbowego. Praktycznie wszystkie tabele powinny być połączone relacją wiele do wielu np. film ma wielu aktorów, a aktor gra w wielu filmach. Film może mieć kilku reżyserów, reżyser nakręcił wiele filmów. Aktor zdobył wiele nagród, film zdobył wiele nagród, a nagroda była dla wielu aktorów/filmów (np. Oskary). Oczywiście, potrzebujesz do tego tabeli pośredniczącej.

Gdybyś przyjął, że film może mieć tylko jednego reżysera, to mógłbyś zrobić tak jak jest teraz. Oczywiście atrybut Reżyser jest do wyrzucenia, skoro masz referencję do tabeli Reżyser.

Nie wiem, do czego ma służyć tabela napisy, więc ciężko mi powiedzieć, czy jest poprawna.

PHP, json to jak najbardziej poprawny standard. Czy jest bezpieczny? To zależy od tego jak będzie zaimplementowany.
 System operacyjny: windows_seven Przeglądarka: firefox
#6
RE: Schemat bazy danych mysql - baza filmów
Chodziło mi o varchar, nie o string. Drobna pomyłka. Czy wymagane jest ustawienie długości varchar np. varchar(20)? Czy wartość w nawiasie można zostawić pustą?

Czy Aktorzy, Rezyser i Filmy muszą mieć oddzielne tabele, żeby łączyć się z Nagrody?

Jak się odwołać do Kategoria_filmowa z Filmy? Nie brakuje tam czegoś (jakiejś dodatkowej kolumny), żeby to działało? Chciałbym otrzymać w jakiej kategorii jest Film o ID_Filmu = 1. Możesz mi napisać jak będzie wyglądało zapytanie?

Wcześniej nie jasno się wyraziłem. Tabela Napisy ma działać na takiej zasadzie, że jeśli w danym filmie napisy końcowe miały kolor niebieski to ustawiam true, reszta false lub null. Jeśli napisy w filmie były niebieskie i białe to ustawiam niebieski true, biały true, reszta false lub null.

Czy wszystko już jest dobrze zrobione, jeśli chodzi o FK i referencje?

Możesz podać mi jakiś przykład błędnej implementacji w PHP? Mój kod działa na zasadzie, że przesyłam dane wykorzystując metodę GET np. http://www.link.pl/skrypt.php?film_ID=.......&tytul=....   a w skrypt.php jest linijka w której jest zapisany SELECT i bierze on wartości z linku. Jest to dobry sposób?

[Obrazek: 37hwq2n.png]
 System operacyjny: windows_eight Przeglądarka: chrome
#7
RE: Schemat bazy danych mysql - baza filmów
Tak przy typie varchar powinieneś ustawiać jego długość. Nawet gdyby można było zostawić pustą, to pytanie jest po co? Wartość domyślna mogłaby być zależna od konfiguracji bazy, co w efekcie mogłoby skutkować różnymi błędami. Np. MS SQL domyślnie ustawiłby długość 1.

Nie, połączenie z nagrodami może być wspólne. Aktor/reżyser zazwyczaj dostaje nagrodę za grę/reżyserię w jakimś filmie. Ta tabela mogłaby wyglądać tak: ID_AKTORA, ID_FILMU,ID_REŻYSERA, ID_NAGRODY, ROK (lub data), OPIS (opcjonalny). Wszystkie pola, poza ostatnim powinny należeć do klucza głównego, a pola z kluczami obcymi powinny mieć właściwość NULLABLE na TRUE (powinny dopuszczać wartości NULL).

Filmy i kategorie. Po pierwsze, powinieneś zdecydować, czy film należy tylko do jednej kategorii, czy może należeć do wielu. Jeżeli do jednej, to sprawa jest prosta - musisz umieścić w tabeli Filmy referencję (ID_Kategorii) do tabeli Kategoria_Filmowa. Jeżeli film może należeć do wielu kategorii, to masz relację wiele do wielu, czyli znowu musisz dać tabelę pośredniczącą.

Napisy - z tego co piszesz, to są to zwykłe atrybuty filmu, zatem po co tworzysz dla nich oddzielną tabelę? Ja bym przeniósł te pola do tabeli Filmy i używał ich jako True/False bo wartość NULL nie ma sensu.

FK i Referencje nie są dobrze zrobione dla przypadków relacji 1 do wielu. Napisy i kategorie nie powinny mieć ID_Filmu, tylko film powinien mieć referencję do kategorii lub napisów. Po co w tabelach pośredniczących ustawiasz klucz główny jako oddzielne pole ID_Film_Nagroda? Jest ono zupełnie zbędne i niepotrzebne. Poprawny przykład podałem wcześniej.

Jeżeli tabele tworzysz przy pomocy pleceń SQL to musisz jeszcze pamiętać o indeksach.

PHP i SQL - z opisu wynika, że prawdopodobnie kod będzie podatny na SQL injection. Poczytaj http://www.w3schools.com/sql/sql_injection.asp Ogólnie rzecz biorąc, to rzeczy o których musisz pamiętać jest dużo, ale to są lata nauki. W wolnej chwili polecam poczytać https://cwe.mitre.org/index.html
 System operacyjny: windows_seven Przeglądarka: firefox
#8
RE: Schemat bazy danych mysql - baza filmów
(09.06.2016, 09:15)koneton napisał(a): Nie, połączenie z nagrodami może być wspólne. Aktor/reżyser zazwyczaj dostaje nagrodę za grę/reżyserię w jakimś filmie. Ta tabela mogłaby wyglądać tak: ID_AKTORA, ID_FILMU,ID_REŻYSERA, ID_NAGRODY,  ROK (lub data), OPIS (opcjonalny). Wszystkie pola, poza ostatnim powinny należeć do klucza głównego, a pola z kluczami obcymi powinny mieć właściwość NULLABLE na TRUE (powinny dopuszczać wartości NULL).

Nie bardzo rozumiem o co Ci chodzi. Ta tabela, którą napisałeś ma być tabelą pośredniczącą czy tabelą o nazwie Nagrody? Na razie wykombinowałem to co jest na diagramie.


Z tego co zrozumiałem taki sposób jest już bezpieczny. Tylko mam mały problem bo otrzymuje komunikat o błędzie: Invalid parameter number: mixed named and positional parameters. Gdzie jest błąd?


Kod PHP:
<?php
    $dbh 
= new PDO("mysql:host=adres.pl;dbname=baza","root","root");
    
$result $dbh->prepare("SELECT * FROM tabela WHERE tytul like %?% ORDER BY id VALUES (:zmienna)");

 
   $result->bindParam(':zmienna'$_GET['tytul']);
 
   $result->execute();
    
    while(
$r $result->fetch()){
        
print_r($r);    
    }
    print 
json_encode($rows);
?>

Czy to jest poprawnie dodany index? Czy w przypadku tabeli Filmy wystarczy ideksować Tytul_pl i Tytul_eng?
Kod PHP:
CREATE INDEX Filmy_Index_PL ON Filmy (Tytul_pl);
CREATE INDEX Filmy_Index_ENG ON Filmy (Tytul_eng); 

Czy w tabelach pośredniczących wszystkie FK powinny być PK?

Co jeszcze jest źle?

[Obrazek: ClbT7an.jpg]
 System operacyjny: windows_eight Przeglądarka: chrome
#9
RE: Schemat bazy danych mysql - baza filmów
Schemat wygląda OK. To co ja bym zmienił, to Rok przeniósłbym z Nagrody do Pośrednik. Długości pól varchar są stanowczo za małe (imię tylko 5 znaków???). Zazwyczaj Indeksy zakładasz na wszystkich kluczach głównych, na wszystkich polach, którymi filtrujesz dane oraz na kluczach obcych.
Odnośnie SQLa, który napisałeś, to nie widzę takiej składki w dokumentacji PDO.prepare http://php.net/manual/en/pdo.prepare.php Skąd to wziąłeś?
 System operacyjny: linux_fedora Przeglądarka: firefox
#10
RE: Schemat bazy danych mysql - baza filmów
Wszędzie wpisałem 5, żeby mi błędów nie wyrzucało. Potem odpowiednio ustawie sobie długość.

Dlaczego Rok do Pośrednik?

Na logikę starałem się coś zrobić z:
Kod PHP:
$stmt $dbh->prepare("INSERT INTO Customers (CustomerName,Address,City) 
VALUES (:nam, :add, :cit)"
);
$stmt->bindParam(':nam'$txtNam);
$stmt->bindParam(':add'$txtAdd);
$stmt->bindParam(':cit'$txtCit);
$stmt->execute(); 

i jakichś tematów na StackOverflow.


Przerobiłem na coś takiego i wygląda na to, że działa:
Kod PHP:
$result $dbh->prepare('SELECT * FROM tabela WHERE tytul LIKE ?');
$result->execute(array("%$zmienna%")); 

Tylko teraz mam pytanie, jakbym chciał dodać jakies inne zmienne, jak wywołać execute?
 System operacyjny: windows_eight Przeglądarka: chrome
Programy: Polecane / Nowe / Inne




Podobne wątki (Schemat bazy danych mysql - baza filmów)
Wątek: Autor Odpowiedzi: Wyświetleń: Ostatni post
  PHP - Sprawdzenie wartości przed dodaniem do bazy MYSQL dawswi1 0 3183 20.02.2020, 22:21
Ostatni post: dawswi1
  Upload pliku na serwer i do bazy danych mati514 3 8453 16.05.2019, 17:12
Ostatni post: mati514
  Zbyt duży zrzut bazy MySQL z!pper 6 11069 04.06.2018, 19:18
Ostatni post: z!pper

Skocz do:


Wybrane wątki (Schemat bazy danych mysql - baza filmów)
Wątek: Autor Odpowiedzi: Wyświetleń: Ostatni post
  Wywołanie diva funkcją SebastianF 3 9859 25.03.2019 10:55
Ostatni post: hydr4x
Scared front-end czy back-end gbr 7 15066 23.03.2019 16:56
Ostatni post: luciussulla
  Gdzie odpłatnie wypozycjonować swoją stronę w html5 w google za 100zł? aktywny27 13 31632 17.02.2019 21:44
Ostatni post: SEMPIRE
  xampp konwersja video milutki182 3 15423 10.02.2019 13:18
Ostatni post: Ajgor
  HTML a Wordpress Majki_77 3 14174 10.02.2019 13:17
Ostatni post: Ajgor
  Gotowe klasy xCart 0 9021 08.02.2019 17:16
Ostatni post: xCart
  Jak ustawić tekst na środku ekranu buzek1 4 3588 08.02.2019 17:07
Ostatni post: xCart
Ściana Problem a zaktualizacją Joomla 3.6.5 do 3.8.8 CREATIVE_ 14 32080 13.01.2019 06:00
Ostatni post: CREATIVE_
  Xampp i CMS Made Simple Echelon 1 10163 07.12.2018 14:35
Ostatni post: raxer
  Problem z certyfikatem na sslforfree.com gentleman 2 11485 11.10.2018 17:09
Ostatni post: Michu_PL
  Generator kodów kreskowych Yanke$ 0 11642 16.09.2018 12:02
Ostatni post: Yanke$
  skalowanie elementów do wielkości ekranu szakal87 1 12251 11.09.2018 05:36
Ostatni post: Michu_PL
  Formularz do zgłaszania błędów na stronie-pomoc w przeróbce. raxer 0 11332 10.09.2018 18:51
Ostatni post: raxer
  Layout Strony Majki_77 2 12844 28.08.2018 16:27
Ostatni post: gentleman
  Zmiana rozmiaru okna przeglądarki a marginesy Wacho 0 11808 09.08.2018 23:15
Ostatni post: Wacho