Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Trzecia postać normalna
Forum PHP.pl > Forum > Bazy danych
primo
Witam,

normalizuję swoją bazę danych wg trzech postaci normalnych. Jako, że nie jest to proces banalny proszę o weryfikację swoich założeń.
Na początek kilka słów objaśnienia:
- tabela filmy - jest tabelą główną posiadająca mnóstwo kluczy obcych - czy w związku z tym te tabele ponny być typu InnoDB czy mogą być MyISAM??
- tabela filmyrezyser i filmyaktorzy rowniez grupuje klucze obce, ktore dopiero z tej tabeli są dodawane do tabeli glownej czyli - filmy.

  1. --
  2. -- Struktura tabeli dla `aktorzy`
  3. --
  4.  
  5. CREATE TABLE `aktorzy` (
  6. `IDAktora` tinyint(4) NOT NULL AUTO_INCREMENT,
  7. `aktor` varchar(100) NOT NULL DEFAULT '',
  8. PRIMARY KEY (`IDAktora`),
  9. KEY `aktor` (`aktor`)
  10. ) TYPE=MyISAM AUTO_INCREMENT=1 ;
  11.  
  12. --
  13. -- Zrzut danych tabeli `aktorzy`
  14. --
  15.  
  16.  
  17. -- --------------------------------------------------------
  18.  
  19. --
  20. -- Struktura tabeli dla `filmy`
  21. --
  22.  
  23. CREATE TABLE `filmy` (
  24. `IDFilmu` int(11) NOT NULL AUTO_INCREMENT,
  25. `tytul` varchar(250) NOT NULL DEFAULT '',
  26. `tytul_org` varchar(250) NOT NULL DEFAULT '',
  27. `IDNosnika` tinyint(1) NOT NULL DEFAULT '0',
  28. `IDGatunku` tinyint(1) NOT NULL DEFAULT '0',
  29. `okladka` varchar(60) NOT NULL DEFAULT '',
  30. `IDLektora` tinyint(1) NOT NULL DEFAULT '0',
  31. `IDFilmyRezyser` tinyint(4) NOT NULL DEFAULT '0',
  32. `IDFilmyAktorzy` tinyint(4) NOT NULL DEFAULT '0',
  33. `recenzja` text NOT NULL,
  34. `dataDodania` timestamp(14) NOT NULL,
  35. PRIMARY KEY (`IDFilmu`),
  36. FULLTEXT KEY `tytul` (`tytul`,`tytul_org`)
  37. ) TYPE=MyISAM AUTO_INCREMENT=1 ;
  38.  
  39. --
  40. -- Zrzut danych tabeli `filmy`
  41. --
  42.  
  43.  
  44. -- --------------------------------------------------------
  45.  
  46. --
  47. -- Struktura tabeli dla `filmyaktorzy`
  48. --
  49.  
  50. CREATE TABLE `filmyaktorzy` (
  51. `IDFilmyAktorzy` tinyint(4) NOT NULL AUTO_INCREMENT,
  52. `IDFilmu` int(11) NOT NULL DEFAULT '0',
  53. `IDAktora` tinyint(4) NOT NULL DEFAULT '0',
  54. PRIMARY KEY (`IDFilmyAktorzy`)
  55. ) TYPE=MyISAM AUTO_INCREMENT=1 ;
  56.  
  57. --
  58. -- Zrzut danych tabeli `filmyaktorzy`
  59. --
  60.  
  61.  
  62. -- --------------------------------------------------------
  63.  
  64. --
  65. -- Struktura tabeli dla `filmyrezyser`
  66. --
  67.  
  68. CREATE TABLE `filmyrezyser` (
  69. `IDFilmyRezyser` tinyint(4) NOT NULL AUTO_INCREMENT,
  70. `IDFilmu` int(11) NOT NULL DEFAULT '0',
  71. `IDRezysera` tinyint(4) NOT NULL DEFAULT '0',
  72. PRIMARY KEY (`IDFilmyRezyser`)
  73. ) TYPE=MyISAM AUTO_INCREMENT=1 ;
  74.  
  75. --
  76. -- Zrzut danych tabeli `filmyrezyser`
  77. --
  78.  
  79.  
  80. -- --------------------------------------------------------
  81.  
  82. --
  83. -- Struktura tabeli dla `gatunek`
  84. --
  85.  
  86. CREATE TABLE `gatunek` (
  87. `IDGatunku` tinyint(4) NOT NULL AUTO_INCREMENT,
  88. `gatunek` varchar(50) NOT NULL DEFAULT '',
  89. PRIMARY KEY (`IDGatunku`),
  90. KEY `gatunek` (`gatunek`)
  91. ) TYPE=MyISAM AUTO_INCREMENT=1 ;
  92.  
  93. --
  94. -- Zrzut danych tabeli `gatunek`
  95. --
  96.  
  97.  
  98. -- --------------------------------------------------------
  99.  
  100. --
  101. -- Struktura tabeli dla `lektor`
  102. --
  103.  
  104. CREATE TABLE `lektor` (
  105. `IDLektora` tinyint(4) NOT NULL AUTO_INCREMENT,
  106. `lektor` char(3) NOT NULL DEFAULT '',
  107. PRIMARY KEY (`IDLektora`),
  108. KEY `lektor` (`lektor`)
  109. ) TYPE=MyISAM AUTO_INCREMENT=1 ;
  110.  
  111. --
  112. -- Zrzut danych tabeli `lektor`
  113. --
  114.  
  115.  
  116. -- --------------------------------------------------------
  117.  
  118. --
  119. -- Struktura tabeli dla `nosniki`
  120. --
  121.  
  122. CREATE TABLE `nosniki` (
  123. `IDNosnika` tinyint(4) NOT NULL AUTO_INCREMENT,
  124. `nosnik` char(3) NOT NULL DEFAULT '',
  125. PRIMARY KEY (`IDNosnika`),
  126. KEY `nosnik` (`nosnik`)
  127. ) TYPE=MyISAM AUTO_INCREMENT=1 ;
  128.  
  129. --
  130. -- Zrzut danych tabeli `nosniki`
  131. --
  132.  
  133.  
  134. -- --------------------------------------------------------
  135.  
  136. --
  137. -- Struktura tabeli dla `rezyser`
  138. --
  139.  
  140. CREATE TABLE `rezyser` (
  141. `IDRezysera` tinyint(4) NOT NULL AUTO_INCREMENT,
  142. `rezyser` varchar(100) NOT NULL DEFAULT '',
  143. PRIMARY KEY (`IDRezysera`),
  144. KEY `rezyser` (`rezyser`)
  145. ) TYPE=MyISAM AUTO_INCREMENT=1 ;
  146.  
  147. --
  148. -- Zrzut danych tabeli `rezyser`
  149. --
elessar
Ja bym powiedzial ze nawet to jest juz 4 (albo nawet i 5) postac :-)
Co do InnoDB/MyISAM -> jezeli chcesz korzystac z kluczy obych to musisz zastosowac InnoDB.
primo
Cytat
ze nawet to jest juz 4 (albo nawet i 5) postac


to tak z przekąsem bez świadomości o tym co mówimy czy poważnie questionmark.gif Istnieją kolejne postacie normalizacji struktury bazy - stąd moje pytanie.

A tak na chłopski rozum to wprowadzilibyście jeszcze jakieś modyfikacje - zwłaszcza czy połączenie tych tabel filmyaktorzy i filmyrezyser mnie interesują questionmark.gif
splatch
primo zrób jakiś diagram, rysunek, cokolwiek - o wiele łatwiej się czyta.

Na pierwszy rzut oka: to nie jest 3 postać normalna. Masz niejasne powiązanie - chodzi o filmy. W tabeli filmy masz IDFilmyAktorzy - zbyteczne. Skoro Masz w firlmyaktorzy id filmu to po co powielać te same dane w filmach? W ten sposób ograniczasz się również do tego, że jeden film ma jednego aktora (jeden wiersz w filmyaktorzy przywiązany do filmu). To samo tyczy się reżyserów.
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.