【问题标题】:Help with a microblog (twitter clone) database structure?帮助微博(推特克隆)数据库结构?
【发布时间】:2011-08-22 16:08:55
【问题描述】:

我正在进行一项练习,希望我创建一个小型 Twitter 克隆,其中包含用户、推文和关注系统。好吧,我想出了以下数据库结构:

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;

有效吗?我错过了什么吗?另外:

  • 如何选择用户的推文?
  • 如何从用户中选择关注者?
  • 如何选择用户关注的人?

我对外键概念有点迷失了。 :(

【问题讨论】:

  • 练习或家庭作业?
  • 有个开源的类似twitter的微博系统,我想是identi.ca
  • 我不是在寻找可以使用的东西,我正在尝试自己制作以提高我的技能

标签: mysql sql database


【解决方案1】:

基于@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 不再安全,因此我建议使用具有 512 位哈希长度的 SHA2。

链接
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
连接:http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_concat
为什么要加盐:What is "salt" when relating to MYSQL sha1?

【讨论】:

  • 我在您的第一个创建表时遇到语法错误,靠近外键语句。
  • 那是因为我是凭记忆输入的,请在以下链接中查找正确的语法:dev.mysql.com/doc/refman/5.1/en/create-table.html
  • 嗯,错误 150 我无法修复。任何想法为什么会发生此错误?它只是说 Cant create table (errno: 150);
  • #1005 - 无法创建表 'microblog.tweets' (errno: 150)
  • 你如何解释“转发推文”?
【解决方案2】:

您不需要表“user_tweet”,因为一条推文只能属于 1 个用户,因此在推文表中包含一个“user_id”会更合乎逻辑

像 user_tweet 这样的交叉表仅在存在多对多关系时才有用(例如,一个老师教多个班级组,班级组从多个老师那里获得课程)

如果你这样做,你可以通过这个 sql 语句选择来自用户的推文:

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

您现在应该能够通过类似的查询获得关注者;D

希望你可以用这个做任何事情!

【讨论】:

  • 但是一个用户可以有很多推文...所以我需要 user_tweet 表,对吧?
  • 不,您可以拥有多个具有相同 user_id 作为外键的推文,表格如下所示:TweetID - UserID - Tweet * 1 - George - Hello world! * 2 - 乔治 - 我的第二条推文,哈哈* 3 - 埃里克 - 这条推文很酷!* 4 - 乔治 - @Eric,这肯定是哈哈! :D _____(这里的 user_id 只是名称,也可能是数字)
猜你喜欢
  • 2021-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多