【问题标题】:Mysql database design with users, groups teams and moreMysql 数据库设计与用户、组团队等
【发布时间】:2019-01-30 19:01:51
【问题描述】:

当来自不同表的不同类型的对象具有自己的自动递增 id 需要与同一个对象交互时,需要帮助试图找出最好的方法。

Facebook 就有这个例子。您既可以以群组/页面的形式点赞帖子,也可以以单个用户的身份点赞帖子。

所以我想弄清楚如何以最好和最有效的方式实现这一目标。

这是我目前所拥有的,以及我认为它如何工作,但我真的需要对此提出第二意见。

比如说我有以下表格

用户

+----+----------+----------+-----------+
| id | username | password | more cols |
+----+----------+----------+-----------+
|  1 | User1    | changeme | etc       |
|  2 | User2    | changeme | etc       |
|  3 | User3    | changeme | etc       |
+----+----------+----------+-----------+

群组

+----+------------------+-----------+
| id |       name       | more cols |
+----+------------------+-----------+
|  1 | We who like cats | etc       |
|  2 | Funny videos     | etc       |
|  3 | Nice food pics   | etc       |
+----+------------------+-----------+

团队

+----+----------------+-----------+
| id |    teamname    | more cols |
+----+----------------+-----------+
|  1 | Team Alpha     | etc       |
|  2 | Team Golden    | etc       |
|  3 | Team Foo       | etc       |
+----+----------------+-----------+

所有这些对象都应该能够与另一个组、用户、团队或其他任何东西创建的东西进行交互。现在假设 team alphauser3 都喜欢组 funny videos 上传的内容。然后,我需要知道是否有喜欢此上传的用户、团队或组来获取喜欢此上传的对象的正确属性。

由于用户、团队或组可以具有相同的 id,我需要一些独特的信息来知道我是否应该查看用户、组或团队表。

所以我想如果我创建下表用于与网站上的所有内容进行交互,并根据 type_id 指向正确的表。

type_id 1 = users
type_id 2 = groups
type_id 3 = teams
+----+-----------+---------+
| id | object_id | type_id |
+----+-----------+---------+
|  1 |         1 |       1 |
|  2 |         1 |       2 |
|  3 |         2 |       1 |
|  4 |         2 |       3 |
|  5 |         1 |       3 |
+----+-----------+---------+

然后,我将 object_id 用于用户、组、团队或其他任何行为的每次交互。

如果有更好的方法,真的很感激所有的想法:)

【问题讨论】:

标签: mysql database-design


【解决方案1】:

我相信还有另一种方法。 我无法评论这就是我回答的原因。

在您的“喜欢”表中,您可以拥有

team_id
group_id
user_id

所以你会有这样的感觉

 +----+-----------+---------+---------+---------+
 | id | object_id | team_id |group_id |user_id  | 
 +----+-----------+---------+---------+---------+
 |  1 |         1 |       1 |NULL     |1        |
 |  2 |         2 |     NULL|1        |NULL     |
 +----+-----------+---------+---------++---------+

当团队/组/用户不喜欢时,您可以拥有 team_id , group_id, user_id0NULL,如果喜欢,则为 1。

一旦为用户或团队生成了该行,下次您查看页面是否有任何类似的内容,如果有,您只需添加喜欢该页面或帖子的 team_id 。 希望对您有所帮助。

【讨论】:

  • 感谢您的回答,但在扩展、性能和功效方面,我认为这不是最佳解决方案。这将要求我检查每个查询哪一列包含 int 值,当涉及到缩放时,我认为这将是一个问题,因为我需要为每个“用户元素”类别提供一个列。
  • 但是在这种情况下,您将获得没有 join 的值,这将比您描述的选项更快?
猜你喜欢
  • 2015-05-04
  • 2015-07-06
  • 2014-03-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-01
  • 2018-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多