Návrh databáze

Rudolf Svátek 2016-06-23 12:29

Jako databázi používám MySQL. Redakční systém není tak náročná aplikace, abych sahal k nějakému korporátnímu řešení a MySQL postačuje. Je dobré, když se zamyslíš ještě dřív, než sedneš k počítači. Normálně popadni tužku a papír a kresli si. Měl bys vědět něco o tom, co plánuješ ve svém redakčním systému používat jako základ. Z toho ti vyplynou tabulky v databázi a jejich struktura a vzájemné vztahy. Zbytek se doplní třeba časem.

Můžeš si stáhnout a importovat dump databáze: redakcni-system.sql.

Já si jako základ zvolil:

  • stránky - to je samozřejmost. Redakční systém je tu ke tvorbě webů, tak musí nějaké stránky zobrazovat
  • komentáře ke stránkám - to nám bude budovat obsah
  • uživatelé - určitě budeš chtít do administrace pustit jen oprávněné uživatele
  • novinky - ty nesmí chybět :-)
  • obrázkové galerie - budou se zobrazovat u zvolených stránek
  • tabulka s nastavením aplikace - název webu, kontakty na administrátora, logo stránek apod.

Tabulka "pages"

Opět je dobré přemýšlet předem. A klidně dlouho. Tabulky je sice možné upravit i po jejich návrhu, ale je lepší to mít od začátku kompletní. Takže co by stránka měla obsahovat, jaké vlastnosti mít? Je dobré o tom pouvažovat ze dvou stanovisek - jako uživatel a jako administrátor.

  1. Jako uživatel
    • název stránky
    • text stránky
    • nadpis
    • připojenou galerii
    • možnost dát komentář
    • možnost odeslat kontaktní formulář
  2. Jako administrátor
    • věci okolo SEO
    • řazení, definice stromu stránek
    • nastavení jako aktivní/neaktivní
    • zařazení do menu
    • povolit zobrazení jen přihlášeným uživatelům
    • přiřazení jedné, či více fotogalerií

Třeba tě napadnou i další věci.

MySQL není moc vhodná pro ukládání stromových struktur, a tak si musíme trochu pomoct. Jde o to rozhodnout se, jak uložit strom stránek, aby se s tím snadno pracovalo. Já se rozhodl pro techniku traverzování okolo stromu. Vynikající články na toto téma a ze kterých jsem vycházel:

Po zvážení všech požadavků jsem se tedy rozhodl pro následující strukturu tabulky pages:

CREATE TABLE `pages` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `parent` int(11) NOT NULL DEFAULT '0',
  `lft` int(11) NOT NULL,
  `rgt` int(11) NOT NULL,
  `level` int(11) NOT NULL,
  `title` varchar(80) COLLATE utf8mb4_czech_ci DEFAULT NULL,
  `name` varchar(80) COLLATE utf8mb4_czech_ci NOT NULL,
  `menuTitle` varchar(80) COLLATE utf8mb4_czech_ci DEFAULT NULL,
  `url` varchar(120) COLLATE utf8mb4_czech_ci DEFAULT NULL,
  `description` varchar(160) COLLATE utf8mb4_czech_ci DEFAULT NULL,
  `keywords` varchar(80) COLLATE utf8mb4_czech_ci DEFAULT NULL,
  `perex` text COLLATE utf8mb4_czech_ci,
  `text` longtext COLLATE utf8mb4_czech_ci,
  `secret` int(1) DEFAULT '0',
  `secretText` longtext COLLATE utf8mb4_czech_ci,
  `lang` int(11) DEFAULT '1',
  `active` int(11) DEFAULT '1',
  `inMenu` varchar(80) COLLATE utf8mb4_czech_ci DEFAULT NULL,
  `onHomepage` int(11) DEFAULT NULL,
  `date` datetime NOT NULL,
  `upDate` datetime NOT NULL,
  `pictureName` varchar(250) COLLATE utf8mb4_czech_ci DEFAULT NULL,
  `pictureDescription` varchar(250) COLLATE utf8mb4_czech_ci DEFAULT NULL,
  `galleryIds` varchar(250) COLLATE utf8mb4_czech_ci DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `url` (`url`),
  KEY `parrent` (`parent`),
  KEY `active` (`active`),
  KEY `onHomepage` (`onHomepage`),
  KEY `lft` (`lft`),
  KEY `rgt` (`rgt`),
  FULLTEXT KEY `name_title_text_perex` (`name`,`title`,`text`,`perex`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_czech_ci;

Pokud ti není jasný význam všech polí, časem se dozvíš k čemu co používám.

Ostatní tabulky už třeba tolik přemýšlení nevyžadují, tak jen zkráceně:

Tabulka "comments"

K článkům na webu bude dobré umožnit vložení komentáře. Tabulka bude jednoduchá a bude obsahovat jen pár polí:

CREATE TABLE `comments` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `articleId` int(10) unsigned NOT NULL,
  `date` datetime NOT NULL,
  `author` varchar(50) COLLATE utf8mb4_czech_ci DEFAULT NULL,
  `text` text COLLATE utf8mb4_czech_ci NOT NULL,
  `allowed` tinyint(1) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `articleId` (`articleId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_czech_ci;

Je tu vlastně jen identifikace článku, ke kterému komentář patří, identifikace autora, datum a text komentáře. Příznak `allowed` říká, zda je komentář schválen a může se zobrazovat.

Tabulka "news"

Sem se ukládají novinky. Struktura je opět velmi jednoduchá:

CREATE TABLE `news` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `active` tinyint(1) NOT NULL,
  `title` varchar(80) COLLATE utf8mb4_czech_ci NOT NULL,
  `url` varchar(80) COLLATE utf8mb4_czech_ci NOT NULL,
  `text` text COLLATE utf8mb4_czech_ci NOT NULL,
  `dateAdd` datetime NOT NULL,
  PRIMARY KEY (`id`),
  KEY `active` (`active`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_czech_ci;

Předpokládám, že v ní jsou všechna pole jasná.

Tabulka "settings"

Tato tabulka bude sloužit k ukládání různých informací - název webu, emailová adresa administrátora, počet stránek pro výpis blogu apod.

CREATE TABLE `settings` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `field` varchar(20) COLLATE utf8mb4_czech_ci NOT NULL,
  `value` text COLLATE utf8mb4_czech_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_czech_ci;

Obsahuje jen definici názvu pole a hodnotu pole.

Tabulka "users"

Tady budou uživatelé apikace. Uvažujeme o tom, že uživatelé by mohli mít více úrovní oprávnění. Třeba jen zobrazit některé skryté stránky, upravit existující stránku v administraci, vložit dalšího uživatele apod. K tomu časem vytvoříme a přidělíme uživatelské role.

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(25) COLLATE utf8mb4_czech_ci NOT NULL,
  `password` varchar(125) COLLATE utf8mb4_czech_ci NOT NULL,
  `name` varchar(125) COLLATE utf8mb4_czech_ci DEFAULT NULL,
  `lastname` varchar(125) COLLATE utf8mb4_czech_ci DEFAULT NULL,
  `email` varchar(125) COLLATE utf8mb4_czech_ci DEFAULT NULL,
  `role` varchar(25) COLLATE utf8mb4_czech_ci NOT NULL,
  `passwordHash` varchar(125) COLLATE utf8mb4_czech_ci DEFAULT NULL,
  `passwordHashValidity` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `username` (`username`),
  UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_czech_ci;

Hesla samozřejmě nebudeme ukládat v čitelné podobě, ale jako hash. Myslíme i na to, že uživatelé heslo zapomenou, tak jim musíme nabídnout možnost si heslo obnovit. V příslušné kapitole se pak podíváme jak na to, aby to bylo bezpečné.

Tabulky "galleries", "page_gallery" a "pictures"

Tyhle tabulky budou spolupracovat. Cílem bude vytvoření fotogalerie, nahrání fotografií a přiřazení fotogalerie ke zvolené stránce. Technicky chceme, aby jedna stránka mohla mít libovolný počet galerií a naopak jedna fotogalerie aby mohla být přidělena k několika různým stránkám.

CREATE TABLE `galleries` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(80) COLLATE utf8mb4_czech_ci NOT NULL,
  `description` varchar(255) COLLATE utf8mb4_czech_ci NOT NULL,
  `url` varchar(80) COLLATE utf8mb4_czech_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_czech_ci;

CREATE TABLE `page_gallery` (
  `page_id` int(11) NOT NULL,
  `gallery_id` int(11) NOT NULL,
  KEY `page_id` (`page_id`),
  KEY `gallery_id` (`gallery_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_czech_ci;

CREATE TABLE `pictures` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(80) COLLATE utf8mb4_czech_ci NOT NULL,
  `description` varchar(255) COLLATE utf8mb4_czech_ci DEFAULT NULL,
  `file` varchar(80) COLLATE utf8mb4_czech_ci DEFAULT NULL,
  `order` int(11) DEFAULT NULL,
  `gallery_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `gallery_id` (`gallery_id`),
  CONSTRAINT `pictures_ibfk_1` FOREIGN KEY (`gallery_id`) REFERENCES `galleries` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_czech_ci;

Tolik tedy k základním tabulkám. Příště si nainstalujeme Nette Framework, nad kterým jsem celý redakční systém stavěl.

Můžeš si stáhnout a importovat dump databáze: redakcni-system.sql.

Redakční systém RS::RS  Následující kapitola

Instalace Nette Framework

 

 

Komentáře (0)

Přidej svůj komentář

O mně

Jmenuji se Rudolf Svátek. Jsem lektor výpočetní techniky a PHP programátor. Stavím firemní stránky a eshopy. Aby se mi to dělalo pohodlně, vytvořil jsem redakční systém RS::RS, který ti tu nabízím k použití.

Rychlý kontakt na mně

  • Rudolf Svátek
  • Telefon:
    +420 777 828 353
  • Email:
  • Adresa:
    Josefa Hory 1097/5
    736 01 Havířov
    ČR



Tyto stránky používají Cookies. Používáním stránek s tím souhlasíte Další informace