用于跟踪多种内容类型的MySQL结构

时间:2010-07-29 21:55:09

标签: php mysql feeds

我正在构建一个网络应用程序,它(理想情况下)允许用户关注讨论主题(这些网站采用Q& A格式),但也遵循其他内容类型,例如拥有个人资料页面的公司和学校。 (该网站旨在帮助寻找专业求职者,因此后端为公司,学校等提供了一个简单的个人资料页面。)

有一个“Follow”表有一个follow_entity_type字段可以访问然后重定向到相应的内容表(Q& A,公司等)会更有效吗?或者,当我尝试编译用户的源时,是否应该为每个需要单独访问的内容类型提供“关注”表?第一个似乎需要更复杂的编码和查询,而第二个则会使按时间顺序组织所有类型的帖子更加困难。

我确信解决方案是直截了当的,但作为兼职开发人员和自学者,我有时会错过基础知识。

2 个答案:

答案 0 :(得分:1)

想想你如何在OO设计中做到这一点:你可以拥有一个可以遵循的所有类型事物的通用超类或接口。称之为Followable

interface Followable { }

class QandA implements Followable { ... }
class Profiles implements Followable { ... }

然后,当您表示“可跟随”对象的集合时,确保集合由$object instanceof Followable为真的对象组成。

您可以使用SQL表执行相同的操作:

CREATE TABLE Followables ( follow_id INT AUTO_INCREMENT PRIMARY KEY ... );

CREATE TABLE QandA ( qanda_id INT PRIMARY KEY ... , 
  FOREIGN KEY (qanda_id) REFERENCES Followables(follow_id));
CREATE TABLE Profiles ( profile_id INT PRIMARY KEY ... , 
  FOREIGN KEY (profile_id) REFERENCES Followables(follow_id));

现在,您对用户遵循的内容的引用是Followables的外键:

CREATE TABLE UserFollows (
  user_id INT NOT NULL,
  follow_id INT NOT NULL,
  PRIMARY KEY (user_id, follow_id),
  FOREIGN KEY (user_id) REFERENCES Users(user_id),
  FOREIGN KEY (follow_id) REFERENCES Followables(follow_id)
);

另见Class Table Inheritance

答案 1 :(得分:0)

我多次使用follow_entity_type字段。在我看来,从实体列表中集成一种额外类型的提取然后在列表的所有实例中集成新的连接表要容易得多。这也意味着每个“内容类型”只需要添加1个而不是2个表,其中存储&检索已经得到了解决。查询不会变得那么难恕我自己。