用于存储来自外部网站的用户数据的数据库设计模式

时间:2012-11-04 21:46:19

标签: mysql sql facebook database-design twitter

我正在开发一个允许用户通过facebooktwitter注册的应用程序,我希望能够使用这些网站上的个人数据并想知道我应该如何存储它。这是我到目前为止所提出的:

enter image description here

user表将存储应该存在的信息,无论用户如何注册,例如first_name

user_property表可用作key-value缓存,并存储特定于facebooktwitter的信息(由origin字段表示)。我会存储可以单独用作API个调用或SQL个查询的属性的属性,例如用户facebook id,我会存储序列化的其他API个调用的结果JSON格式,例如用户facebook friends

那样:

  • 我在user表格中有共同信息,只有一个SELECT我可以获得有关用户的基本有用信息
  • 我有一些来自facebook/twitter的附加属性(例如用户ID),我仍然可以在JOINuser之间使用user_property查找。
  • 我可以检索存储规范化过于昂贵的信息(例如,创建一个表来存储人们的朋友并且每个朋友有1个表条目),JOIN和{{1}之间仍然有user }。

这就是我现在想知道的事情:

Q1:这可能是一个有点可持续的数据库设计还是我弄错了并且遇到了一些问题,如果是的话,哪些问题呢?

Q2:存储频繁更改的信息(例如朋友/关注者列表)时,如何保持信息的最新状态(首先将信息存储在数据库中?如果是,您使用什么标准/触发器来决定何时再次提取信息?

1 个答案:

答案 0 :(得分:1)

您的设计具有EAV架构(实体 - 属性 - 值)的大多数(不良)属性。在这个问题上寻找Wikipedia并环顾这个网站。

使用EAV的最不可持续的设计决策是(恕我直言),一开始这似乎可以很好地扩展。但是一旦你的数据增长,你就会高速撞到混凝土墙。这是因为为了加载一个用户的数据,DB必须使用随机访问触摸物理表的巨大部分。当数据增长并经常更改时,调整数据库以将一个用户的user_property行保持在相邻页面中是一项繁重的任务。