Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Projekt bazy - kilka problemów
Forum PHP.pl > Forum > Bazy danych > MySQL
Fifi209
Witam, zaprojektowałem sobie właśni małą bazę danych do projektu, który niebawem ma ruszyć. Mam kilka pytań i wątpliwości.

Może najpierw cała struktura:
  1. -- phpMyAdmin SQL Dump
  2. -- version 2.11.4
  3. -- <a href="http://www.phpmyadmin.net" target="_blank">http://www.phpmyadmin.net</a>
  4. --
  5. -- Host: localhost
  6. -- Czas wygenerowania: 31 Lip 2010, 19:58
  7. -- Wersja serwera: 5.0.45
  8. -- Wersja PHP: 5.2.5
  9.  
  10. SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
  11.  
  12. --
  13. -- Baza danych: `fansite`
  14. --
  15.  
  16. -- --------------------------------------------------------
  17.  
  18. --
  19. -- Struktura tabeli dla `chance`
  20. --
  21.  
  22. CREATE TABLE `chance` (
  23. `id` smallint(6) NOT NULL AUTO_INCREMENT,
  24. `content` varchar(40) collate utf8_polish_ci NOT NULL,
  25. PRIMARY KEY (`id`)
  26. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=1 ;
  27.  
  28. -- --------------------------------------------------------
  29.  
  30. --
  31. -- Struktura tabeli dla `comments`
  32. --
  33.  
  34. CREATE TABLE `comments` (
  35. `id` smallint(6) NOT NULL AUTO_INCREMENT,
  36. `news_id` smallint(6) NOT NULL,
  37. `author` varchar(40) collate utf8_polish_ci NOT NULL,
  38. `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  39. `subject` varchar(60) collate utf8_polish_ci NOT NULL,
  40. `content` text collate utf8_polish_ci NOT NULL,
  41. PRIMARY KEY (`id`),
  42. KEY `news_id` (`news_id`)
  43. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=1 ;
  44.  
  45. -- --------------------------------------------------------
  46.  
  47. --
  48. -- Struktura tabeli dla `groups`
  49. --
  50.  
  51. CREATE TABLE `groups` (
  52. `id` smallint(6) NOT NULL AUTO_INCREMENT,
  53. `name` varchar(40) collate utf8_polish_ci NOT NULL,
  54. `access` smallint(6) NOT NULL,
  55. PRIMARY KEY (`id`)
  56. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=3 ;
  57.  
  58. -- --------------------------------------------------------
  59.  
  60. --
  61. -- Struktura tabeli dla `guides`
  62. --
  63.  
  64. CREATE TABLE `guides` (
  65. `id` smallint(6) NOT NULL AUTO_INCREMENT,
  66. `author_id` smallint(6) NOT NULL,
  67. `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  68. `subject` varchar(50) collate utf8_polish_ci NOT NULL,
  69. `content` text collate utf8_polish_ci NOT NULL,
  70. PRIMARY KEY (`id`),
  71. KEY `author_id` (`author_id`)
  72. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=1 ;
  73.  
  74. -- --------------------------------------------------------
  75.  
  76. --
  77. -- Struktura tabeli dla `items`
  78. --
  79.  
  80. CREATE TABLE `items` (
  81. `id` smallint(6) NOT NULL AUTO_INCREMENT,
  82. `name` varchar(50) collate utf8_polish_ci NOT NULL,
  83. PRIMARY KEY (`id`)
  84. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=1 ;
  85.  
  86. -- --------------------------------------------------------
  87.  
  88. --
  89. -- Struktura tabeli dla `loot`
  90. --
  91.  
  92. CREATE TABLE `loot` (
  93. `id` smallint(6) NOT NULL AUTO_INCREMENT,
  94. `monster_id` smallint(6) NOT NULL,
  95. `item_id` smallint(6) NOT NULL,
  96. `chance_id` smallint(6) NOT NULL,
  97. PRIMARY KEY (`id`),
  98. KEY `monster_id` (`monster_id`,`item_id`,`chance_id`),
  99. KEY `item_id` (`item_id`),
  100. KEY `chance_id` (`chance_id`)
  101. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=1 ;
  102.  
  103. -- --------------------------------------------------------
  104.  
  105. --
  106. -- Struktura tabeli dla `monsters`
  107. --
  108.  
  109. CREATE TABLE `monsters` (
  110. `id` smallint(6) NOT NULL AUTO_INCREMENT,
  111. `name` varchar(60) collate utf8_polish_ci NOT NULL,
  112. `health` int(11) NOT NULL,
  113. `experience` int(11) NOT NULL,
  114. PRIMARY KEY (`id`)
  115. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=1 ;
  116.  
  117. -- --------------------------------------------------------
  118.  
  119. --
  120. -- Struktura tabeli dla `news`
  121. --
  122.  
  123. CREATE TABLE `news` (
  124. `id` smallint(6) NOT NULL AUTO_INCREMENT,
  125. `subject` varchar(60) collate utf8_polish_ci NOT NULL,
  126. `content` text collate utf8_polish_ci NOT NULL,
  127. `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  128. `author_id` smallint(6) NOT NULL,
  129. PRIMARY KEY (`id`),
  130. KEY `author_id` (`author_id`)
  131. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=1 ;
  132.  
  133. -- --------------------------------------------------------
  134.  
  135. --
  136. -- Struktura tabeli dla `users`
  137. --
  138.  
  139. CREATE TABLE `users` (
  140. `id` smallint(6) NOT NULL AUTO_INCREMENT,
  141. `name` varchar(40) collate utf8_polish_ci NOT NULL,
  142. `password` varchar(40) collate utf8_polish_ci NOT NULL,
  143. `group_id` smallint(6) NOT NULL,
  144. PRIMARY KEY (`id`),
  145. KEY `group_id` (`group_id`)
  146. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=2 ;
  147.  
  148. -- --------------------------------------------------------
  149.  
  150. --
  151. -- Stand-in structure for view `users_view`
  152. --
  153. CREATE TABLE `users_view` (
  154. `id` smallint(6)
  155. ,`name` varchar(40)
  156. ,`password` varchar(40)
  157. ,`group_name` varchar(40)
  158. ,`access` smallint(6)
  159. );
  160. -- --------------------------------------------------------
  161.  
  162. --
  163. -- Structure for view `users_view`
  164. --
  165. DROP TABLE IF EXISTS `users_view`;
  166.  
  167. CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `fansite`.`users_view` AS SELECT `fansite`.`users`.`id` AS `id`,`fansite`.`users`.`name` AS `name`,`fansite`.`users`.`password` AS `password`,`fansite`.`groups`.`name` AS `group_name`,`fansite`.`groups`.`access` AS `access` FROM (`fansite`.`users` LEFT JOIN `fansite`.`groups` ON((`fansite`.`users`.`group_id` = `fansite`.`groups`.`id`)));
  168.  
  169. --
  170. -- Ograniczenia dla zrzutów tabel
  171. --
  172.  
  173. --
  174. -- Ograniczenia dla tabeli `comments`
  175. --
  176. ALTER TABLE `comments`
  177. ADD CONSTRAINT `comments_ibfk_1` FOREIGN KEY (`news_id`) REFERENCES `news` (`id`);
  178.  
  179. --
  180. -- Ograniczenia dla tabeli `guides`
  181. --
  182. ALTER TABLE `guides`
  183. ADD CONSTRAINT `guides_ibfk_1` FOREIGN KEY (`author_id`) REFERENCES `news` (`id`);
  184.  
  185. --
  186. -- Ograniczenia dla tabeli `loot`
  187. --
  188. ALTER TABLE `loot`
  189. ADD CONSTRAINT `loot_ibfk_3` FOREIGN KEY (`chance_id`) REFERENCES `chance` (`id`),
  190. ADD CONSTRAINT `loot_ibfk_1` FOREIGN KEY (`monster_id`) REFERENCES `monsters` (`id`),
  191. ADD CONSTRAINT `loot_ibfk_2` FOREIGN KEY (`item_id`) REFERENCES `items` (`id`);
  192.  
  193. --
  194. -- Ograniczenia dla tabeli `news`
  195. --
  196. ALTER TABLE `news`
  197. ADD CONSTRAINT `news_ibfk_1` FOREIGN KEY (`author_id`) REFERENCES `users` (`id`);
  198.  
  199. --
  200. -- Ograniczenia dla tabeli `users`
  201. --
  202. ALTER TABLE `users`
  203. ADD CONSTRAINT `users_ibfk_1` FOREIGN KEY (`group_id`) REFERENCES `groups` (`id`);
  204.  


Jak widać tabele zostały już powiązane - chyba jest dobrze.
Utworzyłem dodatkowo widok, który pozwoli ułatwi mi tworzenie zapytań w php.

I tutaj pierwszy problem:
Będę potrzebował wyciągnąć danego potwora z bazy z całym lootem.
Tabele: monsters, loot, items, chance
Teraz pytanie jak złączyć te tabele, aby się zbytnio w php nie narobić i zrzucić większość na MySQL, myślałem o widoku, jednak dla jednego potwora loot może zawierać od kilku do kilkunastu elementów.

Drugie jest pytanie:
Czy można zaprojektować to lepiej? W inny sposób? Może inne typy pól? Starałem się wszystko starannie przemyśleć i ocenić +/- ile danych gdzie będę przechowywał.
kilas88
Z tabli comments wywaliłbym news_id i przeniósł do osobnej tabeli. Co jeśli będziesz chciał dodać możliwość komentowania dla czegoś innego? Ale to taka drobnostka biggrin.gif
Fifi209
Cytat(kilas88 @ 31.07.2010, 20:05:50 ) *
Z tabli comments wywaliłbym news_id i przeniósł do osobnej tabeli. Co jeśli będziesz chciał dodać możliwość komentowania dla czegoś innego? Ale to taka drobnostka biggrin.gif

Komentarze mają być tylko dla newsów w dodatku moderowane - o widzisz już jest coś o czym zapomniałem.
Swoją drogą, dodać zwykłe pole które da znać czy zaakceptowany?
kilas88
Cytat(fifi209 @ 31.07.2010, 21:11:11 ) *
Komentarze mają być tylko dla newsów w dodatku moderowane - o widzisz już jest coś o czym zapomniałem.
Swoją drogą, dodać zwykłe pole które da znać czy zaakceptowany?

Zazwyczaj wystarczy pole typu BOOL. Można też dać pole 'status' (TINYINT) i mieć kilka wariantów moderacji.
Fifi209
Cytat(kilas88 @ 31.07.2010, 20:22:18 ) *
Zazwyczaj wystarczy pole typu BOOL. Można też dać pole 'status' (TINYINT) i mieć kilka wariantów moderacji.

Wystarczy mi możliwość akceptowania. ;p
blawat
w czym problem z tym zlaczeniem?

robisz normalnego left joina odpowiednich tabel i tyle... jak dany monster bedzie mial wiecej lotow to np. w widoku monster bedzie powtorzony odpowiednia ilosc razy... kwestia tak na prawde do czego to potrzebujesz? bo biorac pod uwage uzytecznosc to chyba lepiej zrobic jakis obiekt - monster i dolozyc mu metody zwracajace informacje na temat lotow i innych spraw winksmiley.jpg a to czy to zrobisz sobie przez wyciagniecie jednym zapytaniem z widoku wszystkich danych i obrobieniem tego w php czy np 2 osobnymi zapytaniami bez zadnego obrabiania to juz jak ci wygodniej winksmiley.jpg no chyba ze chcesz byc pro winksmiley.jpg to odpal profilera i zobacz co jest wydajniejsze winksmiley.jpg tongue.gif
Fifi209
Cytat(blawat @ 31.07.2010, 20:32:00 ) *
w czym problem z tym zlaczeniem?

robisz normalnego left joina odpowiednich tabel i tyle... jak dany monster bedzie mial wiecej lotow to np. w widoku monster bedzie powtorzony odpowiednia ilosc razy... kwestia tak na prawde do czego to potrzebujesz? bo biorac pod uwage uzytecznosc to chyba lepiej zrobic jakis obiekt - monster i dolozyc mu metody zwracajace informacje na temat lotow i innych spraw winksmiley.jpg a to czy to zrobisz sobie przez wyciagniecie jednym zapytaniem z widoku wszystkich danych i obrobieniem tego w php czy np 2 osobnymi zapytaniami bez zadnego obrabiania to juz jak ci wygodniej winksmiley.jpg no chyba ze chcesz byc pro winksmiley.jpg to odpal profilera i zobacz co jest wydajniejsze winksmiley.jpg tongue.gif


Wolę pomyśleć raz i się poradzić, niż później żałować złego wyboru.
Właśnie jak zrobię widok to będzie powtórzone ileś razy, a nie da się zrobić tak, aby wyciągać wszystko naraz?
tj. jedno zapytanie - jeden rekord - jeden potwór i CAŁY loot
blawat
Cytat(fifi209 @ 31.07.2010, 22:59:40 ) *
jedno zapytanie - jeden rekord - jeden potwór i CAŁY loot


jesli masz kilka loot'ow w bazie (kilka rekordow) to jak chcesz jendym zapytaniem wyciagnac jeden rekord ktory bedzie zawieral w sobie wszystkie te rekordy? takiego czegos sie nie da zrobic - a przynajmniej mi na ten temat nic nie wiadomo....

napisz sobie funckje w php ktora z otrzymanej tablicy wyniku z bazy zrobi ci tablice "dwu wymiarowa" - w "pierwszym wymiarze bedziesz mial potwora a w drugim tablice z lootami"
zelu
GROUP_CONCAT?
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.