【问题标题】:Database design for "shoutout" area“呐喊”区域的数据库设计
【发布时间】:2013-06-24 10:15:18
【问题描述】:

所以目前我有一个“帖子”,用户可以在其中发布消息,例如在 facebook 或 twitter 中。但是到目前为止,用户只能查看他们自己发布的消息。

这是当前的表格设计

ID | username | message | datetime

但是,我有一个“常规”区域,我不仅希望显示来自用户自己的消息,还希望显示来自“朋友”的消息。

到目前为止,我还没有设计如何存储“友谊”。我正在考虑为每个用户创建单独的表来存储他们的朋友,尽管我不知道这是否是一个可行的解决方案。否则我应该如何设计“友谊”关系?

所以我的问题是,

  1. 我应该如何设计一个“朋友”的数据库关系

  2. 我应该如何从与当前用户为好友的所有用户中检索消息?

【问题讨论】:

    标签: database-design


    【解决方案1】:

    如果您没有特别需要使用关系数据库,我建议您考虑使用图形数据库,这些数据库专为处理此类数据可以是定向的(单向的,例如喜欢和 cmets 或双向的,例如友谊)而设计和优化)。

    我没有使用这些数据库的经验,但您的起点(就研究而言)可能是 Neo4j,它是一个似乎很流行的图形数据库。

    在关系方面,您需要一个 Friends 表,其中包含一个 PK user_id 和一个 FK friend_id 都与您的 user_id 字段上的用户表相关。每个关系需要两个条目(因为友谊是双向的)。

    【讨论】:

      【解决方案2】:

      我的建议是不要在您的帖子表中使用“用户名”。字符串比较比整数比较慢几倍。改为存储“user_id”。

      在您的“朋友”表中存储以下列:

      user_id | friend_id 
      

      然后要从用户和他的朋友那里获取消息,您可以执行以下操作:

      SELECT * FROM posts WHERE user_id IN (SELECT friend_id FROM friends WHERE user_id = your_users_id) OR user_id = your_users_id
      

      这可能非常简单,具体取决于您使用的语言和/或框架。

      祝你好运!

      【讨论】:

      • “字符串比较比整数比较慢几倍。”你有衡量标准吗?
      • @wolφi 这是我在 google 上找到的第一篇文章。我不是数据库专家,但我记得读过一篇关于基准测试的文章。可惜我现在找不到。
      • venublog 指的是不同的东西(如果你将数字存储为字符串,你应该将它们作为字符串而不是数字来查询)。
      • 我对 string vs int 声明非常感兴趣。我已经听过很多次了,但还没有看到测量结果,所以任何数据都将不胜感激!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多