php - 社交网络中事件流的数据库模式和查询

标签 php mysql sql database social-networking

首先,我不是 DBA 或 SQL 专家。但是我接手了一个个人项目,该项目要求我全权负责建立社交网络。 (不,我不是要 reshape Facebook。我的目标是小众受众。)是的,我听说过诸如 http://activitystrea.ms/ 之类的框架。 ,但我觉得数据序列化应该是满足我需求的最后手段。

无论如何,How to implement the activity stream in a social network帮助我开始工作,但我还有一些 Unresolved 问题。

下面是我的数据库架构(为了简化省略了一些行):

Action 表:

id    name
-------------
1     post
2     like
3     follow
4     favorite
5     tag
6     share

事件表:

id             (int)
user_id        (int)
action_id      (tinyint)
target_id      (int)
object_id      (tinyint)
date_created   (datetime)

object_id 指的是target_id 是哪个对象类型。这里的想法是表示(用户+ Action +目标对象)

  • 用户帖子媒体
  • 用户最喜欢的场景
  • 用户关注用户

对象(类型)表:

id    name
-------------
1     media
2     scene
3     brand
4     event
5     user

这里的问题是每个 object 都有自己单独的表。例如:

媒体表:

id            (int)
type          (int)
thumbnail     (varchar)
source        (varchar)
description   (varchar)

事件表:

id        (int)
user_id   (int)
name      (varchar)
city      (int)
address   (varchar)
starts    (time)
ends      (time)
about     (varchar)

用户表:

id                (int)
username          (varchar)
profile_picture   (varchar)
location          (int)

那么,查询该数据库的最佳(即最有效)方式是什么?

显然,我可以在 activity 表上执行 SELECT 语句,然后根据 object_id 使用 PHP 中的条件逻辑来对适当的 object 表(例如,media)进行单独查询。

或者在所有 5 个 object 表上实现某种左或内 JOIN 会更聪明(也更有效),如这里所建议的:MySQL if statement conditional join .我不完全熟悉 JOINS 的工作原理,以及 SQL 是否足够智能,可以只为每个 activity 行扫描适当的 object 表,而不是所有连接的表。

当然,第一个解决方案意味着对数据库的更多调用,这是不太理想的。但是,我不确定我还能如何在一个查询中检索所有相关列(例如,media“source”,event“address”)而不实现一些条件逻辑。

最佳答案

假设,您稍微更改一下事件表:

事件表:

id             (int)
user_id        (int)
action_id      (tinyint)
object_id      (tinyint)
date_created   (datetime)

以及每个目标类型的连接表:

activity_id    (int)
target_id      (int)

最后是你的目标表(媒体)

id            (int)
type          (int)
thumbnail     (varchar)
source        (varchar)
description   (varchar)

和目标表(事件)

id        (int)
user_id   (int)
name      (varchar)
city      (int)
address   (varchar)
starts    (time)
ends      (time)
about     (varchar)

现在,您可以选择数据

SELECT
 activity.id,
 activity.user_id,
 activity.action_id,
 action.name,
 activity.object_id,
 object.name,
 media.id as media_id,
 media.type,
 media.thumbnail,
 media.source,
 media.description,
 event.id as event_id,
 event.name,
 ...
FROM
 activity
 LEFT JOIN action ON (action.id = activity.action_id)
 INNER JOIN mediaToActivity ON (mediaToActivity.activity_id = activity.id)
 LEFT JOIN media ON (media.id = mediaToActivity.target_id)
 INNER JOIN eventToActivity ON (eventToActivity.activity_id = activity.id)
 LEFT JOIN event ON (event.id = eventToActivity.target_id)

使用此查询,您应该在一个查询中获取所有行(但只有实际存在的行才填充数据)

请注意,我现在还没有测试过...

关于php - 社交网络中事件流的数据库模式和查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29027680/

相关文章:

mysql - Spark SQL 数据仓库

php - 为什么我使用 .htaccess 文件时会收到 500 错误

php - 一对多数据库输出 - 多个循环或查询?

php - 使用 PHP 创建搜索数据库表单

MySQL - 获取多个设置的最有效查询?

sql - 一个奇怪的 CREATE EXTENSION WITH postgres 错误

php - 我可以 "redeclare"(更新)表添加一些新列吗?

php - 如何删除数组值中的空格?

mysql - 在python中执行executemany命令时获取KeyError

php - 如何将易受攻击的 SQL 查询转换为 PHP 参数化查询