search

Home  >  Q&A  >  body text

php - 类似QQ空间的社交网站的用户动态的数据库应该怎么设计?

最近在做类似的功能,遇到几个问题:
1. 动态类型多样性;
2. 数据模块化存储,各模块间通过rest调用数据,造成拉取动态列表响应时间变长;
3. 数据层级复杂,编码逻辑通用性差。例如:转发一篇文章后,评论该转发,然后回复该评论时的对象层级为: 回复->评论->文章。

求有相关经验者分享一下经验为谢!

以下是现有的设计:

动态的结构:

1

2

3

4

5

6

7

8

9

10

11

<code> {

      user_id: 动态创建者ID,

      action: 行为类型,

      object_type: 动态对象类型,

      object_id: 对象ID,

      object_user: 对象所有者,

      view_count: 0,

      created_at: 创建时间,

      deleted_at: 删除时间,

 }

</code>

场景列表:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

<code>// A 发布 了 文章 xxx

'action'      => NEW,

'user_id'     => A的ID,

'object_id'   => 文章ID,

'object_user' => A的ID,

'object_type' => ARTICLE,

'ext'         => [],

 

// A 发布 了 N张 图片

'action'      => NEW,

'user_id'     => A的ID,

'object_id'   => 图片ID(数组,以逗号隔开),

'object_user' => A的ID,

'object_type' => PICTURE,

'ext'         => [],

 

// 4. A 提了 问题 xxxx

'action'      => NEW,

'user_id'     => A的ID,

'object_id'   => 问题ID,

'object_user' => A的ID,

'object_type' => QUESTION,

'ext'         => [],

 

// 5. A 在 文章 中回复了 B 的 评论

'action'      => REPLY,

'user_id'     => A的ID,

'object_id'   => 评论ID,

'object_user' => B的ID,

'object_type' => COMMENT,

'ext' => [

    'text' => $text,

    'comment_target_id'   => '文章ID', //评论所属对象

    'comment_target_type' => 'ARTICLE',//评论所属对象类型

    'reply_id' => 回复ID,

], 

 

// 6. A 评论 了 B的 文章 xxxx

'action'      => COMMENT,

'user_id'     => A的ID,

'object_id'   => 文章ID,

'object_user' => B的ID,

'object_type' => 'ARTICLE',

'ext' => [

    'comment_id' => '评论ID',

], 

 

// 7. A 回答 了 B 的 提问 xxx

'action'      => RESPOND,

'user_id'     => A的ID,

'object_id'   => 问题ID,

'object_user' => B的ID,

'object_type' => QUESTION,

'ext' => [

    'answer_id' => '答案ID',

], 

</code>

阿神阿神2901 days ago371

reply all(3)I'll reply

  • 天蓬老师

    天蓬老师2017-04-10 14:57:55

    http://www.oschina.net/question/12_70587 这个比较符合我的问题意思

    最终我参考开源中国做了调整,以完成我们的需求:

    动态的结构:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    <code class="lang-php"> {

          user_id:13,

          action: 行为,

     

          object_id: 对象ID,

          object_type: 对象类型,

          object_user_id: 对象用户ID,

     

          parent_object_id: 对象父级ID,

          parent_object_type: 对象父级类型,

          parent_object_user_id: 对象父级用户ID,

     

          reply_id: 回复ID,    // action为回复时有用

          parent_reply_id: 回复的父级回复ID,       // action为回复时有用,回复了别人对评论的回复

          text: '转发或者分享时附加文字',

     

          view_count: 0,

     

          created_at: 创建时间,

          deleted_at: 删除时间,

     }

     

    </code>

    说明:
    1. object_* 只存储主要模块内容信息,不含评论;
    2. parent_object_* 存储有嵌套关系的对象,比如当object_* 为答案时,parent_object_*为问题;
    3. reply_id 用于直接回复评论时用到;
    4. parent_reply_id 父回复ID;
    5. 两个回复ID,使用情况是:当回复了别人的回复时,根据comment_id拉取评论与全部回复,在模板显示时只显示对话的两个回复。

    场景列表:

    一级结构:

    • 安正超 发布文章

    1

    2

    3

    4

    5

    6

    7

    8

    <code class="lang-php"><br>'action'         => NEW,

    'user_id'        => 安正超ID,

     

    'object_id'      => 文章ID,

    'object_user_id' => 安正超ID,

    'object_type'    => ARTICLE,

     

    </code>

    • 安正超 上传 了 N张 图片

    1

    2

    3

    4

    5

    6

    7

    8

    <code class="lang-php"><br>'action'         => NEW,

    'user_id'        => 安正超ID,

     

    'object_id'      => 图片ID(数组,以逗号隔开),

    'object_user_id' => 安正超ID,

    'object_type'    => PICTURE,

     

    </code>

    • 安正超 提了 问题 xxxx

    1

    2

    3

    4

    5

    6

    7

    8

    <code class="lang-php"><br>'action'         => NEW,

    'user_id'        => 安正超ID,

     

    'object_id'      => 问题ID,

    'object_user_id' => 安正超ID,

    'object_type'    => QUESTION

     

    </code>

    二级结构:

    • 安正超 评论文章 xxxx(回答了通用)

    1

    2

    3

    4

    5

    <code class="lang-php"><br>展示:

      文章: xxxxx

          评论:xxxxx (李林评论的)

     

    </code>

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    <code class="lang-php"><br>'action'         => COMMENT,

    'user_id'        => 安正超ID,

     

    'object_id'      => 评论ID,

    'object_type'    => COMMENT,

    'object_user_id' => 安正超ID

     

    'parent_object_id'      => 文章ID,

    'parent_object_user_id' => 作者ID

    'parent_object_type'    => ARTICLE,

     

    </code>

    三级结构:

    • 安正超文章回复李林评论

    1

    2

    3

    4

    5

    6

    7

    <code class="lang-php"><br>展示:

     

      文章: xxxxx

          评论:xxxxx (李林评论的)

              回复:xxxx (安正超)

     

    </code>

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    <code class="lang-php">'action'         => REPLY,

    'user_id'        => 安正超ID,

     

    'object_id'      => 评论ID,

    'object_type'    => COMMENT,

    'object_user_id' => 李林ID

     

    'parent_object_id'      => 文章ID,

    'parent_object_user_id' => 作者ID

    'parent_object_type'    => ARTICLE,

     

    'reply_id'       => 安正超的回复ID

     

    </code>

    四级结构:

    • 安正超 回复李文凯问题 “xxxx” 中 李林答案 下的 评论

    说明:问题信息从答案接口取回

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    <code class="lang-php"><br>展示:

     

      问题: xxxxx

         答案1...

         答案2...

         答案3...(李林回答的)

            评论:xxxxx (李文凯评论的)

                回复:xxxx (安正超)

     

    </code>

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    <code class="lang-php"><br>'action'         => RESPOND,

    'user_id'        => 安正超ID,

     

    'object_id'      => 评论ID,

    'object_type'    => COMMENT,

    'object_user_id' => 李文凯的ID

     

    'parent_object_id'      => 答案ID,

    'parent_object_type'    => ANSWER,

    'parent_object_user_id' => 李林ID

     

    'reply_id'       => 安正超的回复ID

     

    </code>

    • 安正超 回复李文凯问题 “xxxx” 中 李林答案 下的 回复

    说明:问题信息从答案接口取回

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    <code class="lang-php"><br>展示:

     

      问题: xxxxx

         答案1...

         答案2...

         答案3...(李林回答的)

            评论:xxxxx (A评论的)

                李文凯 回复 A:xxxx

                安正超 回复 李文凯:xxxx

    </code>

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    <code class="lang-php"><br>'action'         => RESPOND,

    'user_id'        => 安正超ID,

     

    'object_id'      => 评论ID,

    'object_type'    => COMMENT,

    'object_user_id' => A的ID

     

    'parent_object_id'      =>  答案ID,

    'parent_object_type'    =>  QUESTION,

    'parent_object_user_id' =>  李林ID,

     

    // 以下两个回复只在模板中用到用以决定显示哪两个回复,因为根据comment_id带着回复会全部拉回来

     

    'parent_reply_id' => 李文凯的回复ID,

    'reply_id'        => 安正超的回复ID,

     

    </code>

    欢迎各位指正!

    reply
    0
  • 怪我咯

    怪我咯2017-04-10 14:57:55

    这是你想要的 http://blog.csdn.net/java2king/article/details/6010250

    reply
    0
  • PHP中文网

    PHP中文网2017-04-10 14:57:55

    怎样获取不同模块内容信息,你这个查询这张表,只能查出id,并没有具体的内容

    reply
    0
  • Cancelreply