我正在设计一个包含课程和工作的网站。
我有一份工作表和课程表,每个工作或课程都是由一个“机构”提供的,这个机构是一个机构(提供课程)或一个公司(提供工作)。我正在决定这两个选项:
选项1:使用“机构”表,并为机构和公司提供body_type列。
选项2:使用单独的“机构”和“公司”表格。
我的主要问题是还有一个帖子表,其中显示了所有课程和工作的广告。因此,如果我使用第一个选项,我只需要将body_id作为每个帖子的记录,而如果我选择第二个选项,则在显示帖子时我需要在某个地方进行额外的连接。
哪个选项最好?还是有替代设计?
答案 0 :(得分:2)
不要在SQL语法和“额外连接”方面考虑太多,在模型,实体,属性和关系方面要多考虑。
在最高级别,您的模型的核心实体是一个帖子。帖子的属性是什么?
这些属性中的每一个都是该帖子的唯一属性,因此应该直接位于帖子表中,或者不属于且应该位于相关的表格中;一个明显的例子是“谁发布它” - 这应该只是一个带有ID的PostedBy字段,该ID与海报/正文实体的另一个表相关。 (注意:您的海报实体不一定是您的身体实体......)
您的海报/正文实体有自己的属性,这些属性对于每个海报/正文都是唯一的,或者应该在他们自己的某个规范化实体中。
招聘职位和课程职位是否大不相同?也许你应该考虑具有作业和课程特定数据的CoursePosts和JobPosts子集表,然后将它们加入你的帖子表。
关键是让你的模型处于这样一种状态,即所有实体属性和关系在它们所在的位置都有意义。正确地对实际实体进行建模可以防止性能和逻辑问题。
对于您的具体问题,如果您的身体在属性(姓名,联系信息等)方面基本相同,那么您希望将它们放在同一个表中。如果它们大不相同,那么它们可能应该在不同的表格中。如果它们大不相同,并且您的工作和课程大不相同,那么一定要考虑为JobPosts和CoursePosts创建两个完全不同的数据模型,然后简单地将它们链接到Posts的一些超集表中。但正如您所知,从面向对象的角度来看,如果您的帖子没有任何共同点,但可能是唯一的密钥标识符和一些管理元数据,您甚至可能会问为什么要在应用程序中混合使用这两个实体。
答案 1 :(得分:2)
解析层次结构时,通常有3个选项:
当你杀死父母时,我得到你正在谈论的问题。基本上,您不知道创建外键的表是什么。因此,除非您还创建一个帖子层次结构,其中您有一个与机构相关的帖子和一个与公司相关的单独的帖子表(可怕的解决方案!),这是不行的。您也可以在设计之外解决这个问题,在每个帖子中添加元数据,说明他们应该加入哪个表(不是一个好的选项,因为您的架构不是自我文档,数据将决定如何连接表...这是错误易发生)。
所以我会放弃杀死父母。如果您在不同的表之间没有太多不同的字段,那么杀死孩子会很好。此外,你应该记住,这种方法并不能解决儿童可能同时存在的问题:机构和公司,但似乎并非如此。杀死孩子也是最有效的。
您尚未评估的第三个选项是保持两种方法。这样你就可以保存一个包含主体之间共享值的虚拟表,每个主体都有一个FK到这个“抽象”表(如果你知道我的意思)。这通常是效率最低的方式,但最有可能是最灵活的方式。通过这种方式,您可以轻松处理两种类型的物体,也可以仅处理“身体”类型的物体,但不能处理公司或机构本身(如果这种情况甚至可能或未来可能)。您应该注意,为了将帖子加入机构,您应该始终引用父表,然后将父项与子项一起加入。
这个问题也可能对您有用: