我想练习 Dexie 和 Nuxt,并想到了一个收集血压 (BP) 数据的小应用程序。
想法是:
免责声明:我不太确定,从医学角度来说,这是否有意义,但这是为了练习 dexie,而不是成为一名医生或病人。 :-)
我的问题是:如何在 dexie 中构建这些数据?
我最初想到的是这样的字段结构:
db.version(1).stores({
bp: "&uuid, dateMonth, daySection, data"
})
其中
daySection
是“早上”、“中午”或“晚上”之一,data
是以下形式的 json 对象:
1: {
timestamp,
high,
low,
sys,
comment
},
2: {
timestamp,
high,
low,
sys,
comment
},
3: {
timestamp,
high,
low,
sys,
comment
}
但是这种结构会创建大量冗余数据(例如第一个字段
yearMonth
,以及 day
字段)。它不仅是多余的,而且当要对特定数据进行更新时也很难查询。 (我看到自己写了很多 for 循环或很多 yearMonth.find('day' => ...)
。
另一方面,我一直读到冗余数据在 NoSQL 中相当常见。但不确定这里是否是这种情况。
所以我想知道,是否有更好的方法来构造和查询此类数据?有什么建议/想法吗?
不确定您是否已经找到了解决方案,但由于问题仍然悬而未决,我会尝试一下。
首先,在
bp: "&uuid, dateMonth, daySection, data"
中,您定义的是索引,而不是字段。您可以拥有更多字段。
我建议为每个测量创建一条记录,因此每个测量都将具有以下字段:
uuid, date, daySection, timestamp, high, low, sys, comment
,其中date
将是一些简单的内容,例如“20240201”。您可以决定是否真的需要确切的时间。如果没有,我也会删除时间戳。
我会删除
data
索引,留下 bp: "&uuid, date, daySection"
然后 Dexie 魔法登场了:如果您计划根据日期和一天中的部分查询/更新记录,您只需创建一个 复合索引:
[date+daySection]
。您的查询很简单:
db.bp.where({date: 20240201, daySection: 'noon'}).first()
这将为您提供一条特定记录,然后您可以按照自己的方式操作该记录。
您可以将 where 与任何索引一起使用。要获得一天的所有测量值,您只需执行以下操作:
db.bp.where("date").equals(20240201).toArray()
等等...
所以,最终的定义是这样的:
db.version(1).stores({
bp: "&uuid, date, daySection, [date+daySection]"
})
最终的数据模型:
uuid, date, daySection, high, low, sys, comment
查看我链接的文档页面,它们有很好的示例。我希望这有帮助。如果来得太晚了,希望它能帮助其他寻求反馈的人。