Ajutor MySQL - Baza de date

Buna ziua, sunt incepator in ceea ce priveste bazele de date si programarea in general, si as avea putin nevoie de ajutor. Problema suna in felul urmator:

"Creaţi o bază de date pentru un sistem, folosind ca model reţele sociale existente. Sistemul trebuie să posede informaţii despre utilizatori, precum şi informaţii despre postările pe care le publică aceştia. Pentru utilizatori, trebuie salvate următoarele informaţii:

  • prenume;
  • nume;
  • data naşterii;
  • locul naşterii;
  • adresa de e-mail;
  • numele de utilizator;
  • un scurt CV;
  • o fotografie.

Pentru stări/statusuri trebuie stocate informaţiile despre titlu, conţinut şi data publicării stării, aşadar trebuie marcat şi cui îi aparţine starea respectivă.

Utilizatorii pot să devină prieteni, activitate care, desigur, trebuie notată undeva. Trebuie să salvăm şi utilizatorul care este prietenul utilizatorului nostru, când s-au împrietenit şi care este starea de prietenie (în aşteptare, acceptat, respins).

Ca ajutor în realizarea acestui assignment, puteţi folosi exemplul unei relaţii din lecţia 2.3. - Chei primare şi străine.

Trebuie creată o bază de date pentru un astfel de sistem, însă trebuie să creaţi şi diagrama EER de entităţi şi relaţii. Nu contează dacă începeţi cu un model şi apoi creaţi o bază de date sau invers, dar cu siguranţă se recomandă mai întâi crearea un model, deoarece este mai realist să creaţi mai întâi un plan (schiţă, respectiv un model) şi apoi să transformaţi acel model într-o bază de date reală."

Incercarea mea de rezolvare:

CREATE TABLE `users` (
  `user_id` int NOT NULL AUTO_INCREMENT,
  `first_name` varchar(45) DEFAULT NULL,
  `last_name` varchar(45) DEFAULT NULL,
  `date_of_birth` date DEFAULT NULL,
  `place_of_birth` varchar(50) DEFAULT NULL,
  `email` varchar(50) DEFAULT NULL,
  `username` varchar(25) DEFAULT NULL,
  `short_cv` tinytext,
  `picture` blob,
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

CREATE TABLE `posts` (
  `post_id` int NOT NULL AUTO_INCREMENT,
  `title` tinytext NOT NULL,
  `text` mediumtext NOT NULL,
  `date` date NOT NULL,
  `user_id` int NOT NULL,
  PRIMARY KEY (`post_id`),
  KEY `fk_user_id_idx` (`user_id`),
  CONSTRAINT `fk_user_id` FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

CREATE TABLE `friendship` (
  `user_one_id` int NOT NULL,
  `user_two_id` int NOT NULL,
  `status` tinyint NOT NULL,
  `friendship_date` date NOT NULL,
  PRIMARY KEY (`user_one_id`),
  UNIQUE KEY `user_one` (`user_one_id`) /*!80000 INVISIBLE */,
  UNIQUE KEY `user_two` (`user_two_id`),
  KEY `fk_user_id_idx` (`user_one_id`,`user_two_id`),
  CONSTRAINT `fk_users_id` FOREIGN KEY (`user_one_id`) REFERENCES `users` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

Eu am incercat sa rezolv, insa as avea nevoie de putin ajutor:

  1. Mai trebuie cumva inca un tabel separat spre exemplu numit users_posts care sa aiba users_id si posts_id ca fk, pe langa pk lui?
  2. In ceea ce priveste tabelul cu friendship, oare trebuia sa fi facut si user_two_id drept pk, sau sa scot pk si de la user_one id si sa le fac pe amandoua doar fk?

Astea sunt cam singurele mele intrebari la care nu sunt sigur, si as vrea sa stiu si daca pe langa aceste lucruri, ar mai exista o problema.

Multumesc anticipat!

Edit: pentru tabelul friendship in legatura cu cerinte de notare a starii de prietenie, am incercat sa fac ca pe site-ul acesta: Social Network Friends Relationship Database Design

Edit: realizez ca la users am uitat sa bifez sa fie not null

Cred că vrei să zici

În rest pare ok la o primă vedere

Pai daca pun user_one_id si user_two_id drept UNIQUE, nu mai am nevoie de fk catre tabelul users? Nu am inteles partea aceasta. Nu ar trebui sa am fk indiferent?

My bad… e ok… am crezut că e INDEX în loc de KEY

Salut,

  1. Ai nevoie de user_posts doar in anumite cazuri, de exemplu daca un post poate avea mai multi autori. Pentru ce ai tu eu cred ca user_id din tabela posts este ok.

  2. Ai nevoie de fk daca vrei sa te asiguri ca legatura aia este pentru un utilizator real ( care exista in tabela users ). Poti face fk pe ambele ( separat ), fk pentru user_one_id si fk pentru user_two_id.
    In tabela friendship trebuie sa faci cum a scris @Cornel , asta daca vrei ca un utilizator sa poata avea mai multi prieteni. UNIQUE KEY nu te lasa sa ai mai multe inregistrari pe cheie, in cazul tau pentru user_one_id = 5 poti avea doar o singura inregistrare ( un singur prieten :cry: ), daca pui cheia sa fie (user_one_id, user_two_id) poti avea mai multi prieteni dar nu mai multe inregistrari pentru aceeasi prietenie ( ceea ce este bine ).