Mysql 社交网络背后的数据库结构[指南]

Mysql 社交网络背后的数据库结构[指南],mysql,sql,json,database,post,Mysql,Sql,Json,Database,Post,我正在开发一个android应用程序,比如twitter。我只想知道背后的逻辑 说到mysql,我会为每个注册的用户创建一个新的数据库,还是我有一个巨大的数据库,为每个注册的用户创建一个表?那么,每个用户的表或数据库中是否都有用户名、密码、好友列表和帖子列 我主要想知道是应该为每个新用户创建一个新数据库,还是在现有数据库中创建一个表 谢谢,很抱歉给你带来了不确定性。听起来你对这个完全陌生。。。下面是一个关于如何建立一个典型的用户应用程序的粗略概述。我将使用一些您可能想要查找的术语,以便更好地了解

我正在开发一个android应用程序,比如twitter。我只想知道背后的逻辑

说到mysql,我会为每个注册的用户创建一个新的数据库,还是我有一个巨大的数据库,为每个注册的用户创建一个表?那么,每个用户的表或数据库中是否都有用户名、密码、好友列表和帖子列

我主要想知道是应该为每个新用户创建一个新数据库,还是在现有数据库中创建一个表


谢谢,很抱歉给你带来了不确定性。

听起来你对这个完全陌生。。。下面是一个关于如何建立一个典型的用户应用程序的粗略概述。我将使用一些您可能想要查找的术语,以便更好地了解数据库的一些基础知识。我将把这些放在双引号中,并在底部包括一个列表

您的应用程序将有一个数据库。此数据库将包含一个名为“user”的表,其中包含“id”、“username”、“password”列(您需要了解如何在数据库中安全地存储密码,这超出了此响应的范围。不要仅以纯文本形式存储密码)。包括密码,因为应用程序控制登录。您不使用MySQL用户作为应用程序用户。MySQL可能有两个用户——一个用于您,一个用于您的应用程序。我道歉,如果你已经知道这一点;你看起来很新,可能不会,如果是这样的话,值得一提,因为这会为你省去很多麻烦

应用程序的每个用户在此表中都将作为行/条目存在。列“id”是所谓的“主键”。这意味着该值对于表中的每个条目都不同,并用于唯一标识每个用户

然后,你想让它,让用户可以创建文章。每个用户都可以创建多个帖子,但每个帖子只能由一个用户创建,这就形成了“一对多关系”。这通常是通过创建第二个表“post”来实现的。帖子有“id”、“author”和“content”列。同样,post.id是这个表的主键。post.author就是所谓的“外键”。这意味着它引用一个主键——在本例中是user.id。把它想象成某种指针。如果要查找创建帖子的人的用户名,可以查看“post”表中帖子的条目,并找到该条目对author的值。您可以使用该编号在用户表中查找文章的作者

例如,考虑下面的表:

user
id username
1  awesome_user
2  more_awesome_user
3  less_awesome_user

post
id author content
1  1      I am awesome
2  3      Yes you are, awesome_user
3  2      I am more awesome
4  1      No you're not
5  2      Yes I am look at my name
6  1      having more_ in front of your name doesn't make you more awesome
在本例中,您可以看出“我是很棒的”帖子是由用户“awesome_user”创建的,因为该帖子和用户的post.author=user.id。要了解如何实际编写这样做的查询,您应该在谷歌上搜索术语“连接表”

接下来,假设您需要让用户能够喜欢帖子。一个用户可以喜欢很多帖子,而一篇帖子也可以被很多用户喜欢,这就形成了一种“多对多”的关系。这通常是通过拥有一个表示这种关系的新表来实现的。让我们调用表“user\u likes\u post”。此表将包含以下列:用户、post。它们都是对应表的外键

现在,举个例子:

user_likes_post
user post
1    2
3    5
在这种情况下,您可以告诉用户'awesome_user'喜欢由'less_awesome_user'编写的帖子'Yes you are,awesome_user',因为您可以在用户表中查找用户1,也可以在post表中查找帖子2。同样,在编写查询时,可以连接表以实现这一点

请注意,用户\u likes\u post没有id列。这是因为,在本例中,我们将使用主键(user,post)而不是(id)。主键可能由多列组成。只有当没有两行的这两列的值相同时,才能执行此操作。换言之,允许以下情况:

user post
1    2
1    3
2    2
但是,这是不允许的

user post
1    2
1    2
这对我们很有用,因为这会阻止我们,因为它会阻止双重喜好。这也可以通过将id列作为主键,并在(用户、帖子)上具有“唯一约束”来实现,但我们不太可能需要唯一地标识一个相似项,因此使用id列没有任何意义,因为它只会浪费空间。值得注意的是,外键也可以由多列组成,因此仍然可以从另一个表中引用like。但是,如果您正在考虑这样做,我建议使用id列

我建议你在谷歌上搜索以下术语,并确保你理解它们。这看起来可能令人困惑,但请特别注意数据库规范化。理解数据库规范化背后的一些原因是设计可靠数据库的关键。例如,如果一条数据在数据库中的多个位置,这是一件坏事。它不仅会占用额外的空间,而且如果数据发生变化,您需要在每个位置对其进行更改。如果有一个表“post”中有“username”、“password”、“content”列,然后用户想要更改其密码,那么您必须在post中找到所有具有该用户名的条目,并更改所有这些条目的密码。如果你偶然错过了一个,它可能会导致一些严重的问题。数据库规范化只是对设计数据库以避免类似问题的方法的更正式的定义。将其视为数据库设计的“最佳实践”;如果你知道自己在做什么,打破规则是可以的,但是作为一个初学者,遵守这些规则会为你省去很多麻烦

希望这能让您在学习如何设计数据库方面走上正轨。如果你想澄清这些问题,请告诉我。祝你好运

  • 主键
  • 外键
  • 约束
  • 唯一约束
  • 一对一关系
  • 一对多关系
  • 多对多关系
  • 连接表