Помогите со структурой базы данных микроблогов (твиттер-клон)? - PullRequest
0 голосов
/ 22 августа 2011

Я работаю над упражнением, которое хочет, чтобы я создал небольшой клон твиттера, с пользователями, твитами и следующей системой.Ну, я придумал следующую структуру базы данных:

CREATE TABLE tweets (
  tweet_id INT NOT NULL AUTO_INCREMENT,
  tweet VARCHAR(140) NOT NULL,
  PRIMARY KEY (tweet_id)
) ENGINE=INNODB;


CREATE TABLE users (
  user_id INT NOT NULL AUTO_INCREMENT,
  user VARCHAR(255) NOT NULL,
  password VARCHAR(40) NOT NULL,
  email VARCHAR(255) NOT NULL,
  PRIMARY KEY (user_id)
) ENGINE=INNODB;

CREATE TABLE user_tweets (
  id INT NOT NULL AUTO_INCREMENT,
  id_user INT NOT NULL,
  id_tweet INT NOT NULL,
  PRIMARY KEY(id),
  FOREIGN KEY (id_tweet)
    REFERENCES tweets(tweeth_id)
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  FOREIGN KEY (id_user)
    REFERENCES users(user_id)) ENGINE=INNODB;

CREATE TABLE followers (
  id_user INT NOT NULL REFERENCES users (user_id),
  id_following INT NOT NULL REFERENCES users (user_id),
  PRIMARY KEY (id_user, id_following)
) ENGINE=INNODB;

Это действительно?Я что-то пропустил?Также:

  • Как выбрать твиты от пользователя?
  • Как выбрать подписчиков у пользователя?
  • Как выбрать людей, на которых подписан пользователь?

Я немного растерялся с концепцией внешнего ключа.(

Ответы [ 2 ]

8 голосов
/ 22 августа 2011

Опираясь на ответ @Karel, Я бы использовал немного разные таблицы:

CREATE TABLE tweets (
  tweet_id INT NOT NULL AUTO_INCREMENT,
  user_id INT NOT NULL
  tweet VARCHAR(140) NOT NULL,
  PRIMARY KEY (tweet_id),
  FOREIGN KEY user_id(user_id) REFERENCES users(user_id) 
  ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=INNODB;


CREATE TABLE users (
  user_id INT NOT NULL AUTO_INCREMENT,
  user VARCHAR(255) NOT NULL,
  /*password VARCHAR(40) NOT NULL,*/<<--- NEVER STORE A PASSWORD IN THE CLEAR!
  passhash VARCHAR(40) NOT NULL,
  email VARCHAR(255) NOT NULL,
  PRIMARY KEY (user_id)
) ENGINE=INNODB;


CREATE TABLE followers (
  id_user INT NOT NULL REFERENCES users (user_id),
  id_following INT NOT NULL REFERENCES users (user_id),
  PRIMARY KEY (id_user, id_following)
) ENGINE=INNODB;

Как выбрать твиты от пользователя?

SELECT * FROM tweets WHERE user_id = 458

Как выбрать подписчиков у пользователя?

SELECT * FROM users 
INNER JOIN followers ON (users.users_id = followers.id_user) 
WHERE followers.id_following = 458

Как выбрать людей, на которых подписан пользователь?

SELECT * FROM users
INNER JOIN followers ON (followers.id_following = users.user_id)
WHERE followers.id_user = 458

Используйте хэш SHA2 для сравнения пароля.
И не забудьте добавить соль для перемешивания, чтобы предотвратить атаки радуги.

SELECT user_id 
FROM users 
WHERE users.user = 'OralB' 
      AND users.passhash = SHA2(CONCAT(users.user,'secretToothbrush'),512)

SHA1 больше не является безопасным, поэтому я бы посоветовал использовать SHA2 с длиной хеша 512 бит.

Ссылки
Учебник по MySQL: http://www.tizag.com/mysqlTutorial/
Внешние ключи: http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html
SHA2: http://dev.mysql.com/doc/refman/5.5/en/encryption-functions.html#function_sha2
Concat: http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_concat
Почему соль: Что такое соль применительно к MYSQL sha1?

4 голосов
/ 22 августа 2011

Вам не нужна таблица 'user_tweet', поскольку твит может принадлежать только одному пользователю, поэтому было бы логичнее иметь 'user_id' в вашей твит-таблице

в виде перекрестной таблицы, подобной user_tweetполезно только в том случае, когда существует отношение «многие ко многим» (например, учитель преподает несколько групп классов, группы классов получают классы от нескольких учителей)

если вы сделаете это, вы можете выбрать твиты от пользователя с помощью этого sql-statement:

SELECT Tweet
FROM Tweets t (your table name)
WHERE t.User_ID == UserID_Whose_Tweets_you_want

теперь вы сможете получить последователей с похожим запросом; D

Надеюсь, вы сможете сделать что-нибудь с этим!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...