数据库设计 - 结构

时间:2013-10-17 14:57:40

标签: mysql sql database-design

我正在设计一个包含课程和工作的网站。

我有一份工作表和课程表,每个工作或课程都是由一个“机构”提供的,这个机构是一个机构(提供课程)或一个公司(提供工作)。我正在决定这两个选项:

选项1:使用“机构”表,并为机构和公司提供body_type列。

选项2:使用单独的“机构”和“公司”表格。

我的主要问题是还有一个帖子表,其中显示了所有课程和工作的广告。因此,如果我使用第一个选项,我只需要将body_id作为每个帖子的记录,而如果我选择第二个选项,则在显示帖子时我需要在某个地方进行额外的连接。

哪个选项最好?还是有替代设计?

2 个答案:

答案 0 :(得分:2)

不要在SQL语法和“额外连接”方面考虑太多,在模型,实体,属性和关系方面要多考虑。

在最高级别,您的模型的核心实体是一个帖子。帖子的属性是什么?

  • 是谁发布的
  • 发布时
  • 其内容
  • 用于搜索目的的一些其他元数据
  • (其它?)

这些属性中的每一个都是该帖子的唯一属性,因此应该直接位于帖子表中,或者不属于且应该位于相关的表格中;一个明显的例子是“谁发布它” - 这应该只是一个带有ID的PostedBy字段,该ID与海报/正文实体的另一个表相关。 (注意:您的海报实体不一定是您的身体实体......)

您的海报/正文实体有自己的属性,这些属性对于每个海报/正文都是唯一的,或者应该在他们自己的某个规范化实体中。

招聘职位和课程职位是否大不相同?也许你应该考虑具有作业和课程特定数据的CoursePosts和JobPosts子集表,然后将它们加入你的帖子表。

关键是让你的模型处于这样一种状态,即所有实体属性和关系在它们所在的位置都有意义。正确地对实际实体进行建模可以防止性能和逻辑问题。

对于您的具体问题,如果您的身体在属性(姓名,联系信息等)方面基本相同,那么您希望将它们放在同一个表中。如果它们大不相同,那么它们可能应该在不同的表格中。如果它们大不相同,并且您的工作和课程大不相同,那么一定要考虑为JobPosts和CoursePosts创建两个完全不同的数据模型,然后简单地将它们链接到Posts的一些超集表中。但正如您所知,从面向对象的角度来看,如果您的帖子没有任何共同点,但可能是唯一的密钥标识符和一些管理元数据,您甚至可能会问为什么要在应用程序中混合使用这两个实体。

答案 1 :(得分:2)

解析层次结构时,通常有3个选项:

  • 杀死孩子:你的选择1
  • 杀死父母:你的选择2
  • 保持两者

当你杀死父母时,我得到你正在谈论的问题。基本上,您不知道创建外键的表是什么。因此,除非您还创建一个帖子层次结构,其中您有一个与机构相关的帖子和​​一个与公司相关的单独的帖子表(可怕的解决方案!),这是不行的。您也可以在设计之外解决这个问题,在每个帖子中添加元数据,说明他们应该加入哪个表(不是一个好的选项,因为您的架构不是自我文档,数据将决定如何连接表...这是错误易发生)。

所以我会放弃杀死父母。如果您在不同的表之间没有太多不同的字段,那么杀死孩子会很好。此外,你应该记住,这种方法并不能解决儿童可能同时存在的问题:机构和公司,但似乎并非如此。杀死孩子也是最有效的。

您尚未评估的第三个选项是保持两种方法。这样你就可以保存一个包含主体之间共享值的虚拟表,每个主体都有一个FK到这个“抽象”表(如果你知道我的意思)。这通常是效率最低的方式,但最有可能是最灵活的方式。通过这种方式,您可以轻松处理两种类型的物体,也可以仅处理“身体”类型的物体,但不能处理公司或机构本身(如果这种情况甚至可能或未来可能)。您应该注意,为了将帖子加入机构,您应该始终引用父表,然后将父项与子项一起加入。

这个问题也可能对您有用: