我正在构建一个网络应用程序,它(理想情况下)允许用户关注讨论线程(像本网站一样采用问答格式),但也可以关注其他内容类型,例如具有个人资料页面的公司和学校。 (该网站旨在帮助专业人士求职,因此后端为公司、学校等提供了一个简单的个人资料页面。)
拥有一个具有 follow_entity_type 字段的“关注”表,可以访问该字段,然后重定向到相应的内容表(问答、公司等),会不会更有效?或者,当我尝试编译用户的提要时,我应该为需要单独访问的每种内容类型创建一个“关注”表吗?第一个似乎需要更复杂的编码和查询,而第二个则会使按时间顺序组织所有类型帖子的提要变得更加困难。
我确信解决方案是直接的,但作为一名兼职开发人员和自学者,有时我会错过基础知识。
最佳答案
想一想在面向对象设计中如何做到这一点:对于所有可以遵循的事物类型,您将有一个公共(public)的父类(super class)或接口(interface)。称之为Followable
。
interface Followable { }
class QandA implements Followable { ... }
class Profiles implements Followable { ... }
然后,当您表示“可跟踪”对象的集合时,请确保该集合由 $object instanceof Followable
为 true 的对象组成。
您可以对 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 .
关于php - 支持多种内容类型的 MySQL 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3367273/