不要在 SQL 语法和“额外连接”方面考虑太多,多从模型、实体、属性和关系方面考虑。
在最高级别,模型的中心实体是 Post。帖子的属性是什么?
- 谁发的
- 发布的时候
- 它的内容
- 一些用于搜索目的的附加元数据
- (其他?)
这些属性中的每一个对于该帖子都是唯一的,因此应该直接在帖子表中,或者不是并且应该在相关的表中;一个明显的例子是“谁发布了它”——这应该只是一个 PostedBy 字段,其 ID 与另一个表的海报/正文实体相关联。(注意:您的海报实体不一定是您的身体实体......)
您的海报/正文实体有自己的属性,这些属性对于每个海报/正文都是唯一的,或者再次,应该在它们自己的某个规范化实体中。
职位和课程帖子有很大不同吗?也许您应该考虑包含特定工作和课程数据的 CoursePosts 和 JobPosts 子表,然后将它们加入您的 Posts 表。
关键是让你的模型处于这样一种状态,即所有实体属性和关系在它们所在的位置都是有意义的。正确建模您的实际实体将防止性能和逻辑问题。
对于您的具体问题,如果您的身体在属性(姓名、联系信息等)方面通常相同,那么您希望将它们放在同一个表中。如果它们有很大不同,那么它们可能应该在不同的表中。如果它们有很大的不同,并且你的工作和课程也有很大的不同,那么一定要考虑为 JobPosts 和 CoursePosts 创建两个完全不同的数据模型,然后简单地将它们链接到 Posts 的一些超集表中。但是正如您所知道的,从面向对象的角度来看,如果您的 Posts 没有任何共同点,但可能只有一个唯一的密钥标识符和一些管理元数据,您甚至可能会问为什么要在应用程序中混合这两个实体。