数据库架构和查询,用于累计一段时间内动物每个“类别”的总天数

问题描述 投票:0回答:0

我正在尝试使用 Supabase 设计一个 PostgreSQL 数据库,其中我将存储有关动物及其类别的信息,相关信息是它的年龄和性别,这也是用于定义所述动物类别的信息。

例如,年轻的公马的类别是小马驹,而年轻的母马的类别是母马。对于成年马来说,类别会再次不同,它们可能会受到其他因素的影响,例如阉割状态等......

我需要创建一个数据库,在其中我能够查询选定的时间段并获取每个类别的总天数。因此,如果在 40 天的时间范围内,数据库中有 5 匹小马和 3 匹母马,则查询结果将是

小马队 5* 40 -> 200

母马 3 * 40 -> 120

我的第一次尝试是使用 SQLite 数据库和原生 Android 开发完成的。我所做的是创建两张表,一张用于“动物”,第二张用于类别之间的“转移”。转移表包含动物的初始类别和新类别以及转移的类型(出生、死亡、购买、出售等...)。 为了执行我提到的查询,我将首先获取开始日期每个类别中动物的数量,然后根据接下来几天的转移表更改数量并将这些数字相加。除了使用简单的 select 语句从数据库中获取数据之外,一切都是使用 Kotlin 完成的,虽然我没有进行任何具体的测试,但如果在较旧的设备或模拟器上完成,实际上会花费相当多的时间,而且因为我计划使用Supabase 继续前进,我正在尝试提出一个解决方案,该解决方案将在后端完成所有计算。 到目前为止我想到的是创建三个表。第一个用于“动物”,仅存储年龄、性别和其他一些相关信息,例如阉割状态等。第二个基本上仅存储“类别”以及有关它们的一些信息(名称、描述等)第三个将存储有关类别之间“转移”的信息。我正在考虑的是将动物的 id、类别、将其转移到该类别的日期全部存储为不可空值以及将其从该类别转移出的日期作为可空值。

但是,我不太确定使用这种方法获取一段时间内每个类别的数量的查询应该是什么样子。我的想法是基本上找出 start_date 和 end_date 之间的差异(如果为 null,则用选定的 end_date 替换 end_date),并将这些数字添加到每个类别,但我不知道类似的 SQL 语句应该是什么样子喜欢或者甚至有可能这样做。 如果可能的话,我该如何构造 SQL 语句以使其工作?这是一个好的解决方案还是有更好的解决方案?预先感谢!

我想你只要看看转会表就可以得到你想要的。只需计算开始日期和结束日期之间的天数,受您作为参数提供的 input_start_date 和 input_end_date 的限制,然后将它们按类别_id 分组在一起 SELECT category_id, Sum(Max(( Min(end_date, input_end_date) - Max(start_date, input_start_date) ), 0 )) FROM transfers GROUP BY category_id

postgresql database-design relational-database database-schema supabase
© www.soinside.com 2019 - 2024. All rights reserved.