【问题标题】:Table design for user likes relationship用户喜欢关系的表格设计
【发布时间】:2019-12-05 19:40:42
【问题描述】:

一个例子,我有 4 个表:

  • 用户
  • 照片
  • 视频
  • 音频

我想创建一个像 Facebook 一样的响应功能。哪个更好:

  1. 创建 1 个包含列的表:

    id (int)
    user_id(int)

    target_id(int)

    target_type(enum:video,photo,audio)

  2. 创建 1 个包含列的表:

    id (int)
    user_id (int)
    video_id (int)
    photo_id (int)
    audio_id (int)

  3. 为每种类型创建 3 个表

表名:user_video_likes(列:user_id,video_id)

表名:user_photo_likes(列:user_id,photo_id)

表名:user_audio_likes(列:user_id,audio_id)

通常,我使用选项 3,但在我加入一些具有不同设计的项目(如选项 1 和 2)后让我感到困惑。

  • 我应该使用哪一个具有更好的性能和查询处理能力?
  • 我认为选项 3 更好,但为什么我发现一些项目(具有比我更高的高级地位/经验丰富的员工)具有选项 1 和 2 的设计?
  • 创建更多表是否昂贵?

【问题讨论】:

  • 选项 1 也不错,但选项 2 设计不佳。只是更容易查询。

标签: mysql database performance database-design


【解决方案1】:

类型 1 不需要id。相反,有

PRIMARY KEY(user_id, target_type, target_id)

我喜欢类型2,但是索引很乱;你有什么?这可能会有所帮助:

PRIMARY KEY(user_id, id),   -- to cluster rows for a user
INDEX(id)   -- to keep AUTO_INCREMENT happy

对于类型 3,有这个(等)

PRIMARY KEY(user_id, video_id)

至于什么最好,请提供SELECTs。没有它们,我无法评价哪种模式最好。

【讨论】:

    猜你喜欢
    • 2016-03-11
    • 2017-09-06
    • 2011-08-14
    • 2012-08-02
    • 2012-08-27
    • 2020-05-30
    • 2018-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多