Database 建立多个子表数据库模型的最佳方法

Database 建立多个子表数据库模型的最佳方法,database,typescript,postgresql,typeorm,Database,Typescript,Postgresql,Typeorm,我拥有的:一个Postgres数据库 模型是什么:一个主要实体事件和许多继承的子项(10+)。每个孩子都会有彼此非常不同的属性。每个事件都属于用户,不在示例中,因为它对于此特定情况并不重要。作为一个简化的示例,我附加了一个模拟图 如何使用:将按时间顺序查询模型中所有聚合事件的列表,然后按其“类型”进行过滤,以便显示(参数,症状,…)。这意味着我需要一个列表,其中包含最近20个事件的子集(例如)。对于这20个数据中的每一个,我将从表中获取每个单独的数据(或者首先将其嵌入)。 一些事件的发生频率很

我拥有的:一个Postgres数据库

模型是什么:一个主要实体
事件
和许多继承的子项(10+)。每个孩子都会有彼此非常不同的属性。每个
事件
都属于
用户
,不在示例中,因为它对于此特定情况并不重要。作为一个简化的示例,我附加了一个模拟图

如何使用:将按时间顺序查询模型中所有聚合事件的列表,然后按其“类型”进行过滤,以便显示(
参数
症状
,…)。这意味着我需要一个
列表
,其中包含最近20个
事件的子集(例如)。对于这20个数据中的每一个,我将从表中获取每个单独的数据(或者首先将其嵌入)。
一些事件的发生频率很高,而另一些事件的发生频率要低得多

问题是,什么是建模的最佳方法? 我想到了:

  • 单个表,
    事件
    包含所有内容
    • 缺点:它将包含大量的
      NULL
      s
    • 优点:所有内容都可以通过该表聚合,不需要连接或视图
  • 多个表,每种类型一个
    • 缺点:我需要大量的连接和视图来聚合数据
    • 优点:每个表和条目的数据和类型都有意义
  • 多个表加上一个指向类型行的主
    事件
    
    
    • 缺点:与上面几乎相同,但更容易获得每个
      用户的特定聚合
    • 优点:同上

看起来您在用户实体上有一个直接的树结构。大概是这样的:

然后,您只需要为每个实体创建一个表:

  • 使用者
  • 事件
  • 儿童(参数、症状等)
这些事件有一个
user
字段,其中包含其父用户的ID。类似地,子事件有一个
事件
字段,其中包含其父事件的ID

以便:

"Child" {
  event -> id of parent Event
}
Event {
  user -> id of parent User
}

在TS中,您可以为每种类型的孩子(症状、饮食等)创建实体,以便他们保持严格的类型。每个数据库都有一个单独的表,允许您根据需要优化它们的数据库表示(索引特定字段、规范化等)。单独的表还允许您避免为不常见的值设置大量空值。

这是否意味着
子表将有大量
NULL
s值,因为它用于存储所有不同类型的子表?@vabatta您是对的;我最初的建议——使用一个规范化的子表——会导致过多的空值。我假设子实体彼此非常相似,但这里的情况并非如此。我已经更新了我的建议,为每个子类型推荐分离的表。此外,考虑到子类型和事件类型的相对简单性的差异,可以考虑文档存储数据库。MongoDB或AWS的DocumentDB可能是可行的解决方案。是的,这是有意义的。我也在考虑一个文档存储数据库。我将在确定解决方案后立即更新问题。