Budujemy forum. Część 2 - Baza danych

Data: 2016-03-24, autor: Michał Misztal

Oto część druga procesu budowy forum. Dzisiaj przygotujemy sobie bazę danych. Baza będzie zawierała cztery tabele: na użytkowników, kategorie, tematy i posty. Z projektem tabeli nie ma co kombinować, wezmę ją na żywca stąd.

Czyli logujemy się do bazy i wykonujemy polecenie



CREATE TABLE `users` (
  `id` int(11) NOT NULL,
  `nazwa` varchar(50) COLLATE utf8_polish_ci NOT NULL,
  `haslo` varchar(255) COLLATE utf8_polish_ci NOT NULL,
  `email` varchar(255) COLLATE utf8_polish_ci NOT NULL,
  `dataRejestracji` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `ostatnieLogowanie` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `ranga` smallint(6) NOT NULL DEFAULT '3',
  `lostPassNew` varchar(255) COLLATE utf8_polish_ci NOT NULL,
  `lostPassId` varchar(255) COLLATE utf8_polish_ci NOT NULL,
  `oSobie` varchar(1000) COLLATE utf8_polish_ci NOT NULL,
  `www` varchar(255) COLLATE utf8_polish_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;

ALTER TABLE `users`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `nazwa_unique` (`nazwa`);

ALTER TABLE `users`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

Nasz użytkownik będzie mógł podać całkiem sporo informacji o sobie. Opiszę powyższe

  • id - identyfikator użytkownika, będzie autoinkrementowany
  • nazwa - nasz user będzie max 50 znaków długi, myślę, że powinno starczyć - unikalna
  • haslo - max 255 znaków
  • email - będzie potrzebny w procesie rejestracji i by otrzymywać np subskrypcje
  • dataRejestracji - tutaj ustawimy automatyczny timestamp
  • ostatnieLogowanie - bo fajnie to będzie wyglądać
  • ranga - domyślnie użytkownik dostanie rangę 3, 2 (moderator) lub 1 (admin)
  • lostPassNew - to będzie potrzebne do procedury odzyskiwania hasła
  • lostPassId - ciąg dalszy procedury odzyskiwania
  • oSobie - kilka słów o sobie
  • www - jeśli user posiada własną stronę www to zostanie ona pokazana

Oczywiście można to rozbudowywać o kolejne informacje. Ja na tym poprzestanę. Teraz pora na kategorie. Kategorie będzie mógł tworzyć i usuwać admin. Tutaj nie ma już niczego odkrywczego - auto inkrementowany id, unikalna nazwa i opis.



CREATE TABLE `kategorie` (
  `id` int(11) NOT NULL,
  `nazwa` varchar(100) COLLATE utf8_polish_ci NOT NULL,
  `opis` varchar(255) COLLATE utf8_polish_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;

ALTER TABLE `kategorie`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `nazwa_unique` (`nazwa`);

ALTER TABLE `kategorie`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

Teraz pora na tematy



CREATE TABLE `tematy` (
  `id` int(11) NOT NULL,
  `temat` varchar(255) COLLATE utf8_polish_ci NOT NULL,
  `data` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `kategoria` int(11) NOT NULL,
  `napisanePrzez` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;

ALTER TABLE `tematy`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `temat_unique` (`temat`);

ALTER TABLE `tematy`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

No i jeszcze posty



CREATE TABLE `posty` (
  `id` int(11) NOT NULL,
  `data` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `tresc` text COLLATE utf8_polish_ci NOT NULL,
  `temat` int(11) NOT NULL,
  `napisanePrzez` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;

ALTER TABLE `posty`
  ADD PRIMARY KEY (`id`);

ALTER TABLE `posty`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

I to by było na tyle dzisiaj. Nie będę tworzył tutaj kluczy obcych by łączyć ze sobą tabele. Ja wiem fajnie to wygląda, gdy usuwamy użytkownika i razem z nim kasowane są wszystkie jego posty i tematy, ale jest i drugie dno. Użytkownik mógł napisać coś wartościowego co chcielibyśmy zachować. Zrobimy tak - gdy użytkownik skasuje konto zamiast jego nicka będzie napis "Konto usunięte" - wszelkie informace o użytkowniku będą skasowane. Skasowane posty i tematy będą lądowały w czymś na wzór kosza. Po miesiącu kosz byłby opróżniany.

Skomentuj lub zgłoś błąd

© Michał Misztal 2023