J'ai construit une base de données pour un blog. Je suis encore étudiant, donc mes connaissances sont limitées dans ce domaine. Je poste cette question pour obtenir une brève description de ce que je fais mal, pourquoi et comment je peux y remédier. Je ne suis pas un développeur back-end, donc si vous avez mal compris quelque chose de ce post, je vais l'expliquer plus loin.
Il s'agit d'un simple projet de blog. Les procédures suivantes sont disponibles pour l'administrateur et l'utilisateur.
[~ # ~] admin [~ # ~]
[~ # ~] utilisateur [~ # ~]
Voici les tableaux que j'utilise pour les procédures ci-dessus:
J'utilise une relation un à plusieurs pour connecter les auteurs et les messages tableaux. Chaque auteur peut écrire plusieurs articles et chaque article a besoin d'un seul auteur.
Le diagramme EER est donné ci-dessous:
Et voici à la fois les auteurs et les messages schémas de table:
CREATE TABLE IF NOT EXISTS `authors` (
`author_ID` bigint(10) unsigned NOT NULL AUTO_INCREMENT,
`author_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`author_avatar` text COLLATE utf8_bin NOT NULL,
`author_description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
PRIMARY KEY (`author_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1 ;
CREATE TABLE IF NOT EXISTS `posts` (
`post_ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`post_date` datetime NOT NULL,
`post_content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`post_status` varchar(20) COLLATE utf8_bin NOT NULL DEFAULT 'draft',
`post_type` varchar(10) COLLATE utf8_bin NOT NULL,
`post_like_count` int(10) unsigned NOT NULL DEFAULT '0',
`post_comment_count` int(11) unsigned NOT NULL DEFAULT '0',
`post_has_article` tinyint(4) NOT NULL DEFAULT '0',
`article_title` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`article_content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
PRIMARY KEY (`post_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1 ;
Est-ce comment créer la relation?
Ci-dessous le schéma:
Et le schéma de table:
CREATE TABLE IF NOT EXISTS `comments` (
`comment_ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`comment_post_ID` bigint(20) unsigned NOT NULL,
`comment_count` bigint(20) unsigned NOT NULL,
`comment_author` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`comment_author_IP` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`comment_date` datetime NOT NULL,
`comment_content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`comment_approved` tinyint(4) NOT NULL DEFAULT '0',
`comment_like_count` int(10) unsigned NOT NULL,
`comment_author_email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
PRIMARY KEY (`comment_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1 ;
Ma principale préoccupation est de savoir comment savoir quel message contient quel commentaire. J'ai créé une colonne comment_count
qui contient l'identifiant du message actuel.
Exemple:
Disons que nous avons trois articles avec des identifiants 300, 301, 302
et quatre commentaires. Ensuite, chaque ligne prendra la forme suivante:
comment_ID - comment_post_ID - comment_count
1 300 1
2 301 1
3 301 2
4 301 3
L'article dont l'ID est 302
n'a pas de commentaire, donc aucune ligne n'est enregistrée. Je pense que c'est une sorte de relation plusieurs à plusieurs , mais pas exactement. Le bon formulaire est-il à utiliser?
Ce fut de loin la décision la plus difficile que j'ai prise.
Je ne sais vraiment pas si tout cela devrait être contenu dans un seul tableau.
La pensée était simple. Nous obtenons l'id de fav (commentaire ou publication) et nous l'affectons à la même colonne nommée. Nous obtenons également l'adresse IP de l'utilisateur. Donc, au final, nous savons si un utilisateur a déjà favorisé un article ou non. Mais je ne sais pas si ma mise en œuvre est bonne (et par là je suis maintenable).
Diagramme:
Schéma:
CREATE TABLE IF NOT EXISTS `likes_counter` (
`like_ID` bigint(20) NOT NULL AUTO_INCREMENT,
`like_type` varchar(10) COLLATE utf8_bin NOT NULL,
`like_content_ID` bigint(20) NOT NULL,
`like_IP` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
PRIMARY KEY (`like_ID`),
KEY `like_ID` (`like_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1 ;
Je sais que ce fut un long post mais j'apprécierai déjà vos réponses.
Conseils:
BLOB
, pas TEXT
.BIGINT
; utilisez plutôt INT UNSIGNED
(max ou 4 milliards).PRIMARY KEY
Est un UNIQUE key
Est un KEY
. Ne ré-indexez donc pas le PK.ENUM
pour des choses comme status
et type
.Post
a à la fois un article
et un content
? Quoi de neuf?VARCHAR(39) CHARACTER SET ascii
.