sql >> Database >  >> RDS >> Mysql

Gids voor het ontwerpen van een database voor een sociaal netwerksysteem in MySQL

Deze tutorial biedt de volledige stappen voor het ontwerpen van een databaseschema van het sociale netwerksysteem om de gebruikers, vrienden, volgers, groepen en berichten te beheren.

Het entiteitsrelatiediagram of visueel databaseontwerp wordt hieronder weergegeven.

Database van sociaal netwerksysteem

U kunt ook de populaire tutorials bezoeken, waaronder MySQL 8 installeren op Ubuntu 20.04 LTS, MySQL 8 installeren op Windows, MySQL Workbench installeren op Ubuntu, MySQL 8 installeren met Workbench op Windows 10, RBAC Database in MySql, Blogdatabase in MySql, quizdatabase in MySQL, enquête- en enquêtedatabase in MySQL, online winkelwagendatabase in MySQL, inventarisdatabase in MySQL en leer elementaire SQL-query's in MySQL.

Sociale netwerksysteemdatabase

De allereerste stap is het maken van de sociale netwerksysteemdatabase. Het kan worden gemaakt met behulp van de onderstaande query.

CREATE SCHEMA `sns` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Ik heb de tekenset utf8mb4 . gebruikt om een ​​breed scala aan karakters te ondersteunen.

Gebruikerstabel

In deze sectie zullen we de Gebruikerstabel . ontwerpen om gebruikersinformatie op te slaan. Hieronder staat de beschrijving van alle kolommen van de gebruikerstabel.

Id Het unieke ID om de gebruiker te identificeren.
Voornaam De voornaam van de gebruiker.
Middelste naam De middelste naam van de gebruiker.
Achternaam De achternaam van de gebruiker.
Mobiel Het mobiele nummer van de gebruiker. Het kan worden gebruikt voor aanmeldings- en registratiedoeleinden.
E-mail Het e-mailadres van de gebruiker. Het kan worden gebruikt voor aanmeldings- en registratiedoeleinden.
Wachtwoordhash De wachtwoord-hash gegenereerd door het juiste algoritme. We moeten vermijden om gewone of versleutelde wachtwoorden op te slaan.
Geregistreerd bij Deze kolom kan worden gebruikt om de levensduur van de gebruiker met de applicatie te berekenen.
Laatste aanmelding Het kan worden gebruikt om de laatste login van de gebruiker te identificeren.
Inleiding De korte introductie van de gebruiker.
Profiel Gebruikersgegevens.

De gebruikerstabel met de juiste beperkingen wordt hieronder weergegeven.

CREATE TABLE `sns`.`user` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`firstName` VARCHAR(50) NULL DEFAULT NULL,
`middleName` VARCHAR(50) NULL DEFAULT NULL,
`lastName` VARCHAR(50) NULL DEFAULT NULL,
`username` VARCHAR(50) NULL DEFAULT NULL,
`mobile` VARCHAR(15) NULL,
`email` VARCHAR(50) NULL,
`passwordHash` VARCHAR(32) NOT NULL,
`registeredAt` DATETIME NOT NULL,
`lastLogin` DATETIME NULL DEFAULT NULL,
`intro` TINYTEXT NULL DEFAULT NULL,
`profile` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `uq_username` (`username` ASC),
UNIQUE INDEX `uq_mobile` (`mobile` ASC),
UNIQUE INDEX `uq_email` (`email` ASC) );

Gebruikersvriendentabel

In deze sectie zullen we de Gebruikersvriendentabel . ontwerpen om de gebruikersvrienden op te slaan. De vriendstatus kan worden gebruikt om de vriendschapsstatus bij te houden en het type kan worden gebruikt om het type vriendschap te specificeren. Hieronder staat de beschrijving van alle kolommen van de User Friend Table.

Id Het unieke ID om de vriendschap te identificeren.
Bron-ID Het gebruikers-ID om de gebruiker te identificeren die de vriendschap heeft gestart.
Doel-ID Het gebruikers-ID van de vriend.
Type Het type om vrienden te classificeren. Het kan school, hogeschool of kennis zijn.
Status De status kan Nieuw, Afgewezen of Actief zijn.
Gemaakt op Het slaat de datum en tijd op waarop het vriendschapsverzoek is gestart.
Bijgewerkt om Het slaat de datum en tijd op waarop het vriendschapsverzoek is bijgewerkt.
Opmerkingen Het slaat de notities op die specifiek zijn voor de vriendschap.

De User Friend Table met de juiste beperkingen wordt hieronder getoond.

CREATE TABLE `sns`.`user_friend` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`sourceId` BIGINT NOT NULL,
`targetId` BIGINT NOT NULL,
`type` SMALLINT NOT NULL DEFAULT 0,
`status` SMALLINT NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`notes` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_friend_source` (`sourceId` ASC),
CONSTRAINT `fk_friend_source`
FOREIGN KEY (`sourceId`)
REFERENCES `sns`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);

ALTER TABLE `sns`.`user_friend`
ADD INDEX `idx_friend_target` (`targetId` ASC);
ALTER TABLE `sns`.`user_friend`
ADD CONSTRAINT `fk_friend_target`
FOREIGN KEY (`targetId`)
REFERENCES `sns`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;

ALTER TABLE `sns`.`user_friend` ADD UNIQUE `uq_friend`(`sourceId`, `targetId`);

Tabel met gebruikersvolgers

In deze sectie zullen we de Gebruikersvolgertabel . ontwerpen om de gebruikersvolgers op te slaan. Het volgertype kan worden gebruikt om het type volger op te geven tussen Like, Dislike of Follow. Hieronder vindt u de beschrijving van alle kolommen van de gebruikersvolgertabel.

Id Het unieke ID om de volger te identificeren.
Bron-ID Het gebruikers-ID om de volgergebruiker te identificeren.
Doel-ID Het gebruikers-ID om de volgende gebruiker te identificeren.
Type Het type om volgers te classificeren. Dit kan Like, Dislike of Follow zijn.
Gemaakt op Het slaat de datum en tijd op waarop de volger is gemaakt.
Bijgewerkt om Het slaat de datum en tijd op waarop de volger is bijgewerkt.

De gebruikersvolgertabel met de juiste beperkingen wordt hieronder weergegeven.

CREATE TABLE `sns`.`user_follower` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`sourceId` BIGINT NOT NULL,
`targetId` BIGINT NOT NULL,
`type` SMALLINT NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_ufollower_source` (`sourceId` ASC),
CONSTRAINT `fk_ufollower_source`
FOREIGN KEY (`sourceId`)
REFERENCES `sns`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);

ALTER TABLE `sns`.`user_follower`
ADD INDEX `idx_ufollower_target` (`targetId` ASC);
ALTER TABLE `sns`.`user_follower`
ADD CONSTRAINT `fk_ufollower_target`
FOREIGN KEY (`targetId`)
REFERENCES `sns`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;


ALTER TABLE `sns`.`user_follower` ADD UNIQUE `uq_ufollower`(`sourceId`, `targetId`, `type`);

Tabel met gebruikersberichten

In deze sectie zullen we de Tabel met gebruikersberichten . ontwerpen om de chatberichten van de gebruiker op te slaan. Hieronder staat de beschrijving van alle kolommen van de gebruikersberichtentabel.

Id Het unieke ID om het bericht te identificeren.
Bron-ID Het gebruikers-ID om de afzender te identificeren.
Doel-ID Het gebruikers-ID om de ontvanger te identificeren.
Bericht De berichttekst.
Gemaakt op Het slaat de datum en tijd op waarop het bericht is gemaakt.
Bijgewerkt om Het slaat de datum en tijd op waarop het bericht is bijgewerkt.

De tabel met gebruikersberichten met de juiste beperkingen wordt hieronder weergegeven.

CREATE TABLE `sns`.`user_message` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`sourceId` BIGINT NOT NULL,
`targetId` BIGINT NOT NULL,
`message` TINYTEXT NULL DEFAULT NULL,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_umessage_source` (`sourceId` ASC),
CONSTRAINT `fk_umessage_source`
FOREIGN KEY (`sourceId`)
REFERENCES `sns`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);

ALTER TABLE `sns`.`user_message`
ADD INDEX `idx_umessage_target` (`targetId` ASC);
ALTER TABLE `sns`.`user_message`
ADD CONSTRAINT `fk_umessage_target`
FOREIGN KEY (`targetId`)
REFERENCES `sns`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;

Tabel gebruikerspost

In deze sectie zullen we de Gebruikersposttabel . ontwerpen om de gebruikersberichten op te slaan. De afzender kan worden gevraagd om de andere gebruikers met de juiste machtigingen toe te staan ​​om op de gebruikersmuur te posten. Hieronder staat de beschrijving van alle kolommen van de User Post Table.

Id Het unieke ID om het bericht te identificeren.
Gebruikers-ID De gebruikers-ID om de corresponderende gebruiker te identificeren.
Afzender-ID De afzender-ID om de corresponderende afzender te identificeren.
Bericht De berichttekst.
Gemaakt op Het slaat de datum en tijd op waarop het bericht is gemaakt.
Bijgewerkt om Het slaat de datum en tijd op waarop het bericht is bijgewerkt.

De gebruikersposttabel met de juiste beperkingen wordt hieronder weergegeven.

CREATE TABLE `sns`.`user_post` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`userId` BIGINT NOT NULL,
`senderId` BIGINT NOT NULL,
`message` TINYTEXT NULL DEFAULT NULL,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_upost_user` (`userId` ASC),
CONSTRAINT `fk_upost_user`
FOREIGN KEY (`userId`)
REFERENCES `sns`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);

ALTER TABLE `sns`.`user_post`
ADD INDEX `idx_upost_sender` (`senderId` ASC);
ALTER TABLE `sns`.`user_post`
ADD CONSTRAINT `fk_upost_sender`
FOREIGN KEY (`senderId`)
REFERENCES `sns`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;

Groepstabel

In deze sectie zullen we de Groepstabel . ontwerpen om de groepsgegevens op te slaan. Hieronder staat de beschrijving van alle kolommen van de Groepstabel.

Id Het unieke ID om de groep te identificeren.
Gemaakt door Het gebruikers-ID om de gebruiker te identificeren die de groep heeft geregistreerd.
Bijgewerkt door Het gebruikers-ID om de gebruiker te identificeren die de groep heeft bijgewerkt.
Titel De groepstitel.
Metatitel De metatitel die moet worden gebruikt voor browsertitel en SEO-doeleinden.
Naaktslak De slug om de unieke URL te vormen.
Samenvatting De samenvatting om de belangrijkste hoogtepunten te noemen.
Status De status van de groep kan Nieuw, Goedgekeurd, Actief of Geblokkeerd zijn.
Gemaakt op Het slaat de datum en tijd op waarop de groep is gemaakt.
Bijgewerkt om Het slaat de datum en tijd op waarop de groep is bijgewerkt.
Profiel De kolom die wordt gebruikt om de profieldetails van de groep op te slaan.
Inhoud De kolom die wordt gebruikt om de aanvullende details van de groep op te slaan.

Het gebruikt de kolomstatus om de status van de groep bij te houden. De status kan Nieuw, Goedgekeurd, Actief of Geblokkeerd zijn. De Groepstabel met de juiste beperkingen is zoals hieronder weergegeven.

CREATE TABLE `sns`.`group` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`createdBy` BIGINT NOT NULL,
`updatedBy` BIGINT NOT NULL,
`title` VARCHAR(75) NOT NULL,
`metaTitle` VARCHAR(100) NULL,
`slug` VARCHAR(100) NOT NULL,
`summary` TINYTEXT NULL,
`status` SMALLINT NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`profile` TEXT NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `uq_slug` (`slug` ASC),
INDEX `idx_group_creator` (`createdBy` ASC),
CONSTRAINT `fk_group_creator`
FOREIGN KEY (`createdBy`)
REFERENCES `sns`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);

ALTER TABLE `sns`.`group`
ADD INDEX `idx_group_modifier` (`updatedBy` ASC);
ALTER TABLE `sns`.`group`
ADD CONSTRAINT `fk_group_modifier`
FOREIGN KEY (`updatedBy`)
REFERENCES `sns`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;

Groepsmeta

De groepsmetatabel kan worden gebruikt om aanvullende informatie over groepen op te slaan, inclusief de groepsbanner-URL enz. Hieronder vindt u de beschrijving van alle kolommen van de groepsmetatabel.

Id De unieke id om de groepsmeta te identificeren.
Groeps-ID De groeps-ID om de bovenliggende groep te identificeren.
Sleutel De sleutel die de meta identificeert.
Inhoud De kolom die wordt gebruikt om de metadata van de groep op te slaan.

De groepsmetatabel met de juiste beperkingen is zoals hieronder weergegeven.

CREATE TABLE `sns`.`group_meta` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`groupId` BIGINT NOT NULL,
`key` VARCHAR(50) NOT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_meta_group` (`groupId` ASC),
UNIQUE INDEX `uq_meta_group` (`groupId` ASC, `key` ASC),
CONSTRAINT `fk_meta_group`
FOREIGN KEY (`groupId`)
REFERENCES `sns`.`group` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;

Groepsledentabel

In deze sectie zullen we de Groepsledentabel . ontwerpen om de groepsleden op te slaan. De lidstatus kan worden gebruikt om de lidmaatschapsstatus bij te houden en de ledenrol kan worden gebruikt om de lidrechten te identificeren. Hieronder staat de beschrijving van alle kolommen van de Groepsledentabel.

Id De unieke id om het lidmaatschap te identificeren.
Groeps-ID De groeps-ID om de corresponderende groep te identificeren.
Gebruikers-ID De gebruikers-ID om de corresponderende gebruiker te identificeren.
Rol-ID De rol om gebruikersrechten te controleren.
Status De status kan Nieuw, Afgewezen, Actief of Geblokkeerd zijn.
Gemaakt op Het slaat de datum en tijd op waarop het lidmaatschapsverzoek is gestart.
Bijgewerkt om Het slaat de datum en tijd op waarop het lid is bijgewerkt.
Opmerkingen Het slaat de notities op die specifiek zijn voor het lidmaatschap.

De groepsledentabel met de juiste beperkingen wordt hieronder weergegeven.

CREATE TABLE `sns`.`group_member` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`groupId` BIGINT NOT NULL,
`userId` BIGINT NOT NULL,
`type` SMALLINT NOT NULL DEFAULT 0,
`status` SMALLINT NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`notes` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_member_group` (`groupId` ASC),
CONSTRAINT `fk_member_group`
FOREIGN KEY (`groupId`)
REFERENCES `sns`.`group` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);

ALTER TABLE `sns`.`group_member`
ADD INDEX `idx_member_user` (`userId` ASC);
ALTER TABLE `sns`.`group_member`
ADD CONSTRAINT `fk_member_user`
FOREIGN KEY (`userId`)
REFERENCES `sns`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;

ALTER TABLE `sns`.`group_member` ADD UNIQUE `uq_friend`(`groupId`, `userId`);
toe

Groepsvolgertabel

In deze sectie zullen we de Groepsvolger-tabel . ontwerpen om de groepsvolgers op te slaan. Het volgertype kan Like, Dislike of Follow zijn. Hieronder staat de beschrijving van alle kolommen van de Groepsvolgertabel.

Id Het unieke ID om de volger te identificeren.
Groeps-ID De groeps-ID om de corresponderende groep te identificeren.
Gebruikers-ID De gebruikers-ID om de corresponderende gebruiker te identificeren.
Type Het volgertype kan Like, Dislike of Follow zijn.
Gemaakt op Het slaat de datum en tijd op waarop de volger is gemaakt.
Bijgewerkt om Het slaat de datum en tijd op waarop de volger is bijgewerkt.

De Groepsvolger-tabel met de juiste beperkingen wordt hieronder weergegeven.

CREATE TABLE `sns`.`group_follower` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`groupId` BIGINT NOT NULL,
`userId` BIGINT NOT NULL,
`type` SMALLINT NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_gfollower_group` (`groupId` ASC),
CONSTRAINT `fk_gfollower_group`
FOREIGN KEY (`groupId`)
REFERENCES `sns`.`group` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);

ALTER TABLE `sns`.`group_follower`
ADD INDEX `idx_gfollower_user` (`userId` ASC);
ALTER TABLE `sns`.`group_follower`
ADD CONSTRAINT `fk_gfollower_user`
FOREIGN KEY (`userId`)
REFERENCES `sns`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;

ALTER TABLE `sns`.`group_follower` ADD UNIQUE `uq_friend`(`groupId`, `userId`, `type`);

Groepsberichtentabel

In deze sectie zullen we de Groepsberichtentabel . ontwerpen om de groepschatberichten op te slaan. Hieronder staat de beschrijving van alle kolommen van de Groepsberichtentabel.

Id Het unieke ID om het bericht te identificeren.
Groeps-ID De groeps-ID om de corresponderende groep te identificeren.
Gebruikers-ID De gebruikers-ID om de corresponderende gebruiker te identificeren.
Bericht De berichttekst.
Gemaakt op Het slaat de datum en tijd op waarop het bericht is gemaakt.
Bijgewerkt om Het slaat de datum en tijd op waarop het bericht is bijgewerkt.

De groepsberichtentabel met de juiste beperkingen wordt hieronder weergegeven.

CREATE TABLE `sns`.`group_message` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`groupId` BIGINT NOT NULL,
`userId` BIGINT NOT NULL,
`message` TINYTEXT NULL DEFAULT NULL,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_gmessage_group` (`groupId` ASC),
CONSTRAINT `fk_gmessage_group`
FOREIGN KEY (`groupId`)
REFERENCES `sns`.`group` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);

ALTER TABLE `sns`.`group_message`
ADD INDEX `idx_gmessage_user` (`userId` ASC);
ALTER TABLE `sns`.`group_message`
ADD CONSTRAINT `fk_gmessage_user`
FOREIGN KEY (`userId`)
REFERENCES `sns`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;

Groepsposttabel

In deze sectie zullen we de Groepsposttabel . ontwerpen om de groepsberichten op te slaan. De leden met de juiste rol kunnen posten in de groep. Hieronder staat de beschrijving van alle kolommen van de Groepsposttabel.

Id Het unieke ID om het bericht te identificeren.
Groeps-ID De groeps-ID om de corresponderende groep te identificeren.
Gebruikers-ID De gebruikers-ID om de corresponderende gebruiker te identificeren.
Bericht De berichttekst.
Gemaakt op Het slaat de datum en tijd op waarop het bericht is gemaakt.
Bijgewerkt om Het slaat de datum en tijd op waarop het bericht is bijgewerkt.

De Groepsposttabel met de juiste beperkingen wordt hieronder weergegeven.

CREATE TABLE `sns`.`group_post` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`groupId` BIGINT NOT NULL,
`userId` BIGINT NOT NULL,
`message` TINYTEXT NULL DEFAULT NULL,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_gpost_group` (`groupId` ASC),
CONSTRAINT `fk_gpost_group`
FOREIGN KEY (`groupId`)
REFERENCES `sns`.`group` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);

ALTER TABLE `sns`.`group_post`
ADD INDEX `idx_gpost_user` (`userId` ASC);
ALTER TABLE `sns`.`group_post`
ADD CONSTRAINT `fk_gpost_user`
FOREIGN KEY (`userId`)
REFERENCES `sns`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;

Samenvatting

In deze zelfstudie hebben we het databaseontwerp van een sociaal netwerksysteem besproken om de gebruikers, vrienden, volgers, berichten en groepen te beheren.

U kunt uw opmerkingen indienen om deel te nemen aan de discussie. Mogelijk bent u ook geïnteresseerd in het ontwerpen van de database van de toepassingen Blog, Shopping Cart en Poll &Survey. Het volledige databaseschema is ook beschikbaar op GitHub.


  1. Hoe een string te splitsen met scheidingsteken char met T-SQL?

  2. Kolomtelling komt niet overeen met waardetelling in rij 1

  3. Maak een tijdelijke tabel in een SELECT-instructie zonder een aparte CREATE TABLE

  4. SQLite - Gegevens selecteren