【发布时间】: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 alpha 和 user3 都喜欢组 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 用于用户、组、团队或其他任何行为的每次交互。
如果有更好的方法,真的很感激所有的想法:)
【问题讨论】:
-
多态关联,来自 Bill Karwin 的演讲。slideshare.net/billkarwin/sql-antipatterns-strike-back/… 他的书“SQL 反模式”可在 find bookellers amazon.com/SQL-Antipatterns-Programming-Pragmatic-Programmers/… 获得。
-
Type_id 在任何 RDBMS 中都是一个非常笨拙的概念;避免它。
-
@RickJames 好的,你知道我怎样才能做得更好吗?
标签: mysql database-design