【发布时间】:2021-10-27 13:32:13
【问题描述】:
我正在设计一个数据库(postgresql),它可以存储用户全天的膳食,并且将来会根据这些日常信息进行每周、每月或每年的分析。我最初的设计是有一个meals 表,看起来像:
meals(表名)
- id(主键)
- user_id(外键)
- picture_ids
- 标签
- 注意
- 时间戳
通过这种结构,查询用户在指定天的用餐数据可以先过滤mealsuser_id,再过滤timestamp。而对于一个用户,一天的多餐会插入多条记录。
另一种方法是使用 [json 或 jsonb 类型](https://www.postgresql.org/docs/current/datatype-json.html) 从 `timestamp` 中提取“时间”部分,因此 `timestamp` 仅包含 ' year', 'month', 'date',因此我可能有一个名为 `meals_of_day` 的表:
meals_of_day(表名)
- id(主键)
- user_id(外键)
- 记录(json类型)
- 日期
records 列中的数据可能如下所示:
{
"08:30": {
picture_ids: [1,2],
labels: ['meat', 'apple'],
note: 'meat was too salty'
},
"12:45": {
// some data
},
"19:05": {
// some data
}
}
这样一个用户每天只有一行,插入一顿饭实际上是更新user+date对应行的records列。
- 当用户登录用餐时,哪种方法的响应时间更短?
- 如果分析功能涉及大量与时间相关的查询,哪种方法更有效?
谢谢。
【问题讨论】:
-
我认为响应时间差异是过早的优化。即使一个速度快 50%……您可能在谈论亚毫秒级的差异。我会考虑许多其他考虑因素(例如这些方法如何影响您的应用程序层、前端等),但不会考虑写入性能的差异。
-
您希望对哪些与时间相关的查询进行分析?您可以对 JSONB 内的键进行索引,因此可以对嵌套的 JSON 数据进行非常高效的查询,但这在很大程度上取决于您要执行的操作。
标签: sql json postgresql database-design database-schema