Budujemy forum. Część 2 - Baza danych
Data: 2016-03-24, autor: Michał MisztalOto 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.