Denne vejledning indeholder de komplette trin til at designe et databaseskema for det sociale netværkssystem til at administrere brugere, venner, følgere, grupper og beskeder.
Entity Relationship Diagram eller visuelle databasedesign er vist nedenfor.
Social Network System Database
Du kan også besøge de populære tutorials, herunder Sådan installeres MySQL 8 på Ubuntu 20.04 LTS, Sådan installeres MySQL 8 på Windows, Sådan installeres MySQL Workbench på Ubuntu, Sådan installeres MySQL 8 med Workbench på Windows 10, RBAC-database i MySql, Blogdatabase i MySQL, Quiz-database i MySQL, afstemnings- og undersøgelsesdatabase i MySQL, Online Shopping Cart Database i MySQL, Inventory Database i MySQL og Lær grundlæggende SQL-forespørgsler i MySQL.
Social Network System Database
Det allerførste trin er at oprette den sociale netværkssystemdatabase. Den kan oprettes ved hjælp af forespørgslen som vist nedenfor.
CREATE SCHEMA `sns` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Jeg har brugt tegnsættet utf8mb4 for at understøtte en bred vifte af tegn.
Brugertabel
I dette afsnit vil vi designe Brugertabellen at gemme brugeroplysninger. Nedenfor nævnt er beskrivelsen af alle kolonnerne i brugertabellen.
Id | Det unikke id til at identificere brugeren. |
Fornavn | Brugerens fornavn. |
Mellemnavn | Brugerens mellemnavn. |
Efternavn | Brugerens efternavn. |
Mobil | Brugerens mobilnummer. Det kan bruges til login og registreringsformål. |
Brugerens e-mail. Det kan bruges til login og registreringsformål. | |
Password Hash | Adgangskodehashen genereret af den passende algoritme. Vi skal undgå at gemme almindelige eller krypterede adgangskoder. |
Registreret på | Denne kolonne kan bruges til at beregne levetiden for brugeren med applikationen. |
Sidste login | Det kan bruges til at identificere brugerens sidste login. |
Introduktion | Den korte introduktion af brugeren. |
Profil | Brugeroplysninger. |
Brugertabellen med de relevante begrænsninger er vist nedenfor.
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) );
Tabel med brugervenner
I dette afsnit vil vi designe Brugerven-tabellen at gemme brugerens venner. Venskabsstatus kan bruges til at spore venskabsstatus, og type kan bruges til at angive venskabstypen. Nedenfor nævnt er beskrivelsen af alle kolonnerne i brugervenskabstabellen.
Id | Det unikke id til at identificere venskabet. |
Kilde-id | Bruger-id'et til at identificere den bruger, der startede venskabet. |
Mål-id | Vennes bruger-id. |
Type | Typen til at klassificere venner. Det kan være skole, college eller bekendtskab. |
Status | Statusen kan være Ny, Afvist eller Aktiv. |
Oprettet på | Den gemmer datoen og tidspunktet, hvor venneanmodningen blev påbegyndt. |
Opdateret kl. | Den gemmer datoen og tidspunktet, hvor venneanmodningen blev opdateret. |
Noter | Det gemmer de noter, der er specifikke for venskabet. |
Brugerven-tabellen med de relevante begrænsninger er vist nedenfor.
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`);
Brugerfølgertabel
I dette afsnit vil vi designe Brugerfølgertabellen at gemme brugerens følgere. Følgertypen kan bruges til at angive typen af følger blandt Like, Dislike eller Follow. Nedenfor nævnt er beskrivelsen af alle kolonnerne i brugerfølgertabellen.
Id | Det unikke id til at identificere følgeren. |
Kilde-id | Bruger-id'et til at identificere følgerbrugeren. |
Mål-id | Bruger-id'et til at identificere følgende bruger. |
Type | Typen til at klassificere følgere. Det kan være Like, Dislike, eller Follow. |
Oprettet på | Den gemmer datoen og klokkeslættet, hvor følgeren blev oprettet. |
Opdateret kl. | Den gemmer datoen og tidspunktet, hvor følgeren blev opdateret. |
Brugerfølgertabellen med de relevante begrænsninger er vist nedenfor.
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`);
Brugermeddelelsestabel
I dette afsnit vil vi designe Brugermeddelelsestabellen for at gemme brugerens chatbeskeder. Nedenfor nævnt er beskrivelsen af alle kolonnerne i brugermeddelelsestabellen.
Id | Det unikke id til at identificere meddelelsen. |
Kilde-id | Bruger-id'et til at identificere afsenderen. |
Mål-id | Bruger-id'et til at identificere modtageren. |
Besked | Meddelelsesteksten. |
Oprettet på | Den gemmer datoen og klokkeslættet, hvor meddelelsen blev oprettet. |
Opdateret kl. | Den gemmer datoen og klokkeslættet, hvor meddelelsen blev opdateret. |
Brugermeddelelsestabellen med de relevante begrænsninger er vist nedenfor.
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;
Brugerposttabel
I dette afsnit vil vi designe Brugerposttabellen at gemme brugerindlæggene. Afsenderen kan blive bedt om at tillade andre brugere med passende tilladelser at skrive på brugervæggen. Nedenfor nævnt er beskrivelsen af alle kolonnerne i brugerindlægstabellen.
Id | Det unikke id til at identificere indlægget. |
Bruger-id | Bruger-id'et til at identificere den tilsvarende bruger. |
Afsender-id | Afsender-id'et til at identificere den tilsvarende afsender. |
Besked | Meddelelsesteksten. |
Oprettet på | Den gemmer datoen og tidspunktet, hvor indlægget blev oprettet. |
Opdateret kl. | Den gemmer datoen og tidspunktet, hvor indlægget blev opdateret. |
Brugerindlægstabellen med de relevante begrænsninger er vist nedenfor.
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;
Gruppetabel
I dette afsnit vil vi designe Gruppetabellen for at gemme gruppedata. Nedenfor nævnt er beskrivelsen af alle kolonnerne i gruppetabellen.
Id | Det unikke id til at identificere gruppen. |
Oprettet af | Bruger-id'et til at identificere den bruger, der har registreret gruppen. |
Opdateret af | Bruger-id'et til at identificere den bruger, der opdaterede gruppen. |
Titel | Gruppetitlen. |
Metatitel | Metatitlen, der skal bruges til browsertitel og SEO-formål. |
Snegl | Sneglen til at danne den unikke URL. |
Oversigt | Opsummeringen for at nævne de vigtigste højdepunkter. |
Status | Gruppens status kan være Ny, Godkendt, Aktiv eller Blokeret. |
Oprettet på | Den gemmer datoen og tidspunktet, hvor gruppen er oprettet. |
Opdateret kl. | Den gemmer datoen og klokkeslættet, hvor gruppen opdateres. |
Profil | Kolonnen, der bruges til at gemme gruppens profildetaljer. |
Indhold | Kolonnen, der bruges til at gemme de yderligere oplysninger om gruppen. |
Den bruger kolonnestatus til at spore gruppens status. Status kan enten være Ny, Godkendt, Aktiv eller Blokeret. Gruppetabellen med de relevante begrænsninger er som vist nedenfor.
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;
Gruppe Meta
Gruppe-metatabellen kan bruges til at gemme yderligere information om grupper, herunder gruppebanner-URL osv. Nedenfor nævnt er beskrivelsen af alle kolonnerne i gruppe-metatabellen.
Id | Det unikke id til at identificere gruppens meta. |
Gruppe-id | Gruppe-id'et til at identificere den overordnede gruppe. |
Nøgle | Nøglen, der identificerer metaen. |
Indhold | Kolonnen, der bruges til at gemme gruppens metadata. |
Gruppe-metatabellen med de relevante begrænsninger er som vist nedenfor.
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;
Gruppemedlemstabel
I dette afsnit vil vi designe Gruppemedlemstabellen at gemme gruppemedlemmerne. Medlemsstatus kan bruges til at spore medlemsstatus, og medlemsrolle kan bruges til at identificere medlemsrettighederne. Nedenfor nævnt er beskrivelsen af alle kolonnerne i gruppemedlemstabellen.
Id | Det unikke id til at identificere medlemskabet. |
Gruppe-id | Gruppe-id'et til at identificere den tilsvarende gruppe. |
Bruger-id | Bruger-id'et til at identificere den tilsvarende bruger. |
Rolle-id | Rollen til at kontrollere brugerrettigheder. |
Status | Statusen kan være Ny, Afvist, Aktiv eller Blokeret. |
Oprettet på | Den gemmer datoen og tidspunktet, hvor medlemsanmodningen blev påbegyndt. |
Opdateret kl. | Det gemmer datoen og tidspunktet, hvor medlemmet blev opdateret. |
Noter | Det gemmer de noter, der er specifikke for medlemskabet. |
Gruppemedlemstabellen med de relevante begrænsninger er vist nedenfor.
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`);
Gruppefølgertabel
I dette afsnit vil vi designe Gruppefølgertabellen at gemme gruppens følgere. Følgertypen kan være Synes godt om, Kan ikke lide eller Følg. Nedenfor nævnt er beskrivelsen af alle kolonnerne i gruppefølgetabellen.
Id | Det unikke id til at identificere følgeren. |
Gruppe-id | Gruppe-id'et til at identificere den tilsvarende gruppe. |
Bruger-id | Bruger-id'et til at identificere den tilsvarende bruger. |
Type | Følgertypen kan være Synes godt om, Kan ikke lide eller Følg. |
Oprettet på | Den gemmer datoen og klokkeslættet, hvor følgeren blev oprettet. |
Opdateret kl. | Den gemmer datoen og tidspunktet, hvor følgeren blev opdateret. |
Gruppefølgertabellen med de relevante begrænsninger er vist nedenfor.
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`);
Gruppemeddelelsestabel
I dette afsnit vil vi designe Gruppemeddelelsestabellen for at gemme gruppechatbeskederne. Nedenfor nævnt er beskrivelsen af alle kolonnerne i gruppemeddelelsestabellen.
Id | Det unikke id til at identificere meddelelsen. |
Gruppe-id | Gruppe-id'et til at identificere den tilsvarende gruppe. |
Bruger-id | Bruger-id'et til at identificere den tilsvarende bruger. |
Besked | Meddelelsesteksten. |
Oprettet på | Den gemmer datoen og klokkeslættet, hvor meddelelsen blev oprettet. |
Opdateret kl. | Den gemmer datoen og klokkeslættet, hvor meddelelsen blev opdateret. |
Gruppemeddelelsestabellen med de relevante begrænsninger er vist nedenfor.
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;
Gruppeposttabel
I dette afsnit vil vi designe Gruppeposttabellen for at gemme gruppeindlæggene. De medlemmer, der har den relevante rolle, kan skrive til gruppen. Nedenfor nævnt er beskrivelsen af alle kolonnerne i gruppeposttabellen.
Id | Det unikke id til at identificere indlægget. |
Gruppe-id | Gruppe-id'et til at identificere den tilsvarende gruppe. |
Bruger-id | Bruger-id'et til at identificere den tilsvarende bruger. |
Besked | Meddelelsesteksten. |
Oprettet på | Den gemmer datoen og tidspunktet, hvor indlægget blev oprettet. |
Opdateret kl. | Det gemmer datoen og tidspunktet, hvor indlægget blev opdateret. |
Gruppeposttabellen med de relevante begrænsninger er vist nedenfor.
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;
Oversigt
I denne øvelse har vi diskuteret databasedesignet af et socialt netværkssystem til at administrere brugere, venner, følgere, beskeder og grupper.
Du kan indsende dine kommentarer for at deltage i diskussionen. Du kan også være interesseret i at designe databasen med blog-, indkøbskurv- og afstemnings- og undersøgelsesapplikationerne. Det komplette databaseskema er også tilgængeligt på GitHub.