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