【问题标题】:Database structure behind social networks [guidance] [closed]社交网络背后的数据库结构 [指南] [关闭]
【发布时间】:2015-07-10 18:07:09
【问题描述】:

我正在开发像 twitter 这样的安卓应用程序。我只是想知道它背后的逻辑。

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

我基本上想知道是否应该为每个新用户创建一个新数据库或在现有数据库中创建一个表..

谢谢,对不确定性表示抱歉。

【问题讨论】:

  • 为每个用户创建一个新数据库...?欧。 o
  • 两者都不是。不要为 each 成员创建单独的对象(数据库、表或其他)。为Users 创建一个表,并为每个用户在该表中添加一个新条目。为Posts 等提供一个表。您可能需要先熟悉数据库的工作原理以及应如何使用的基础知识。
  • 但是说我有一个帖子表,我如何查看每个帖子的发布者?因为用户在不同的表中?
  • 您的 Users 表将有一个 UserID,而 Posts 表也将有一个 UserID。然后就可以使用join命令来链接两个表了。

标签: mysql sql json database post


【解决方案1】:

听起来您对这个完全陌生...这是一个带有用户的典型应用程序设置的粗略概述。我将使用一些您可能想要查找的术语,以更好地了解数据库的一些基础知识。我会将它们放在双引号中,并在底部包含一个列表。

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

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

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

例如,考虑以下表格:

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。要了解如何实际编写执行此操作的查询,您应该在 Google 上搜索“连接表”一词。

接下来,假设您需要让用户能够喜欢帖子。一个用户可以点赞很多帖子,而一个帖子可以被很多用户点赞,这就是“多对多”的关系。这通常是通过有一个代表这种关系的新表来完成的。让我们将表称为“user_likes_post”。该表将包含以下列:用户、帖子。它们都是对应表的外键。

现在举个例子:

user_likes_post
user post
1    2
3    5

在这种情况下,您可以知道用户 'awesome_user' 喜欢 'less_awesome_user' 写的帖子 'Yes you are, awesome_user',因为您可以在 user 表中查找用户 1,并且可以在 user 表中查找帖子 2发布表。同样,在编写查询时,您可以连接表来实现这一点。

请注意,user_likes_post 没有 id 列。这是因为,在这种情况下,我们将创建主键 (user, post) 而不是 (id)。主键可以由多个列组成。只有当没有两行的两列具有相同的值时,才能这样做。换句话说,以下是允许的:

user post
1    2
1    3
2    2

但是,这是不允许的

user post
1    2
1    2

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

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

希望这能让您走上学习如何设计数据库的正确轨道。让我知道您是否需要对此进行澄清。祝你好运!

  • 主键
  • 外键
  • 约束
  • 唯一约束
  • 一对一的关系
  • 一对多关系
  • 多对多关系
  • 连接表
  • 实体关系图
  • 数据库规范化

【讨论】:

  • 神圣的废话只是为了努力。
  • 嗯,这是我在这个网站上的第一篇文章,所以我不妨把它做好,哈哈
  • 此外,我亲眼目睹了当完全不知道一对多关系如何工作的人(例如,包含管道分隔值的列)设计整个应用程序时会发生什么。在过去的 2 年里,我一直在努力收拾 5 年的烂摊子……如果我能通过尽早解决问题来拯救其他人的痛苦,我很高兴。
  • 这是一个了不起的答案。
猜你喜欢
  • 2012-02-27
  • 2015-06-22
  • 2019-10-06
  • 2014-01-31
  • 2019-02-26
  • 2012-04-19
  • 2011-05-08
  • 2011-04-10
  • 1970-01-01
相关资源
最近更新 更多