数据库设计:嵌套对象应该有自己的表吗?

时间:2017-06-06 12:57:29

标签: sql sql-server entity-framework database-design

我对数据库设计有些新意,所以我想了解如何最好地放置当前表格。

我有一张表Jobs,可以容纳各种各样的工作。用户可以创建SubjobsSubjob有一个Job作为父级。 Subjob具有与Job相同的所有属性,但其中一些属性是只读的,而它们都是Job的读/写。 Job可以包含多个Subjobs。目前,可能只有一层subjobs,但我希望将来允许Subjobs无限嵌套的灵活性。这些对象将通过MVC Web应用程序进行交互。

我考虑过两种布局选择:

  • JobsSubjobs都有自己的表格。
    • 这好像"好的设计"因为我不会在Job中引入列,其唯一目的就是与自己嵌套。
    • 编写Web应用程序有点痛苦,因为JobSubjob必须有两个独立的控制器/视图集,尽管它们在属性上是相同的。
    • 如果引入无限嵌套,从设计角度来看,它就没什么意义了。
  • JobsSubjobs位于同一张桌子上。 Jobs只是一个可为空的parent_job_id属性,如果它是Subjob,则该属性为非null。
    • 对无限嵌套有意义。
    • 减少编写Web应用程序的痛苦。
    • Job表中引入了一个奇怪的嵌套属性,该属性与Job的实际属性无关。

有关如何处理此事的任何建议?我还没考虑过额外的设计模式吗?如果重要的话,我正在使用Entity Framework 6 Code First。

1 个答案:

答案 0 :(得分:3)

如果您没有描述具有多个级别的层次结构,那么第一个选项就可以了,但您确实如此。您描述的模式通常称为邻接列表,在您描述第二个选项时会存储该模式。

存储层次结构的其他一些选项是:

  • 嵌套集(更复杂的实现,但可能更快,没有递归的查询)。
  • 物化路径(存储层次路径的字符表示,例如文件存储系统)
  • 邻接列表的修改/帮助表(平面表,桥接表)
  • 自定义实施,例如HierarchyId

层次结构参考: