数据库设计:研究相关项目的多个表与单个表



我正在制作一个研究存储库,其中有不同类型的研究项目,如会议、出版物、专利、主题演讲等。数据将在从相关来源获得、处理后插入,然后从excel表中批量插入。主要操作是根据登录用户查询数据,如个人的研究员相关信息、主席的部门/单位相关信息(主要是汇总行(等。现在,当我处理这个问题时,我看到了两个选项:

Make two tables, one for the research item type and the other for the actual item 
Make individual tables for all type of objects 

第一个结构的问题是,我将创建一个包含空/空列的巨大主表。但这将允许我在未来轻松添加另一个研究项目,因为我可以简单地在"类型"表中添加新项目,然后在公共表中添加实际数据。

然而,第二种方法允许我只查询相关的表来获取信息,因此没有空/null值。缺点是我将无法在此结构中添加新的研究项目,并且我需要为新的项目类型添加新的表。

如果我可以问的话,你会推荐这两种策略中的哪一种,为什么?

The 1st one entails multiple database queries, and the second one entails a large single table.

如果有帮助的话,我使用的是MS SQL服务器。

您面临的问题是ER模型中层次结构的解决方案。您有一个父实体或泛化(RESEARCH_ITEM(,可以用不同的方式实例化(您的子实体,如PUBLICATION、PATENT等(。

要在物理层中实现此层次结构(即创建表(,您必须考虑此层次结构具有哪些属性。特别是,你必须问问自己:

  • 重叠约束:父实体的实例可以属于多个子实体吗
  • 覆盖约束:子实体是否覆盖父实体的所有可能实例

结合这两个标准,我们有四种可能的情况:

  1. 完全不相交:子实体覆盖了所有可能的实例没有重叠
  2. 部分不相交:子实体没有覆盖所有可能的内容实例,并且没有重叠
  3. 完全重叠:子实体涵盖所有可能具有潜在重叠的实例
  4. 部分重叠:子实体不覆盖所有可能的实例和可能的重叠

层次结构的分辨率取决于场景。如果层次结构是完全不相交的,那么最好的做法是消除父实体,并将其属性合并到子实体中(更快的查询,更干净的表(。另一方面,如果存在重叠,这种解决方案就不是最佳的,因为您会有重复的数据(两个子表中的同一行(。在这种情况下,您可以选择将子项合并到父项中,并为子项特定的属性提供可能的NULL字段。

此外,为了设计更好的实现,您必须考虑如何访问数据(我知道有没有一个孩子会经常被查询?在这种情况下,单独的表会很好(。

最新更新