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

Database Design: Multiple tables vs a single table for research related items

我正在做一个研究资料库,里面有会议、出版物、专利、主题演讲等不同类型的研究项目。数据将在从相关来源获取、处理后批量插入来自 excel sheet。主要操作是根据logged-in用户如researcher相关信息查询个人,department/unit相关信息(主要汇总行)chairperson等。 现在当我接近这个时,我看到两个选项:

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

第一个结构的问题是我将一个巨大的主 table 和 empty/null 列。但它将允许我在未来轻松添加另一个研究项目,因为我可以简单地在 "type" table 中添加新项目,然后在公共 table 中添加实际数据。

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

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

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

如果有帮助,我正在使用 MS SQL 服务器。

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

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

  • 重叠约束:parent实体的一个实例可以属于多个child实体吗?
  • 覆盖约束:child实体是否覆盖了parent实体的所有可能实例?

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

  1. 完全不相交:child 个实体涵盖了所有可能的实例 没有重叠;
  2. 部分不相交:child 实体没有涵盖所有可能的情况 实例并且没有重叠;
  3. 完全重叠:child 个实体涵盖了所有可能的 有潜在重叠的实例;
  4. 部分重叠:child 实体未涵盖所有 可能的实例,并且可能存在重叠。

层次结构的解析取决于场景。如果您的层次结构是 total-disjoint 层次结构,那么最好的办法是消除 parent 实体并将其属性合并到 child 实体中(更快的查询,更清晰的 table)。 另一方面,如果存在重叠,则此解决方案不是最佳的,因为您会重复数据(两个 child table 中的同一行)。在这种情况下,您可以选择在 parent 中合并 children,child-specific 属性可能包含 NULL 字段。

此外,为了设计更好的实现,您必须考虑如何访问数据(是否有我知道会经常查询的 child?在这种情况下,一个单独的table 就好了)。