我有一个数据库表User
。
数据库表中的每个用户都有一个字段score
。
我想说明用户的分数是如何随时间变化的。
如何存储此分数?我应该创建一个包含字段Score
,userId
,score
的独立数据库表timestamp
吗?
我是否仍然要在用户表中保存排名,还是将排名存储在Score
表中?我应该使用字段currentScoreId
或指向分数据库表中行的某些内容吗?
我正在使用MongoDB,因此使用关系查询并不容易,但我认为将排名存储在单独的数据库表和用户表中似乎很愚蠢。
答案 0 :(得分:2)
如果每个用户的得分列表不是那么大,您可以考虑使用这样的架构:
List<Request> requests = new LinkedList<Request>();
requests.add(1, new ArgumentRequest("-R"));
requests.add(new CommandRequest("ls\n"));
client.processRequests(requests);
MongoDB中的数据库建模是不同的。与传统的关系数据库一样,您没有简单的表连接。
截至排名时,您想将其另存为单独的字段吗?我认为即使使用传统的数据库,也很难更新数据库中的所有排名。所以上面我添加了一个{
userId: "String",
currentScore: { // this would be the copy of the most recent score
score: "Integer",
timeStamp: "Date"
},
scores: [ // an array of all scores of this user
{
score: "Integer",
timestamp: "Date"
},
...
]
}
字段,您可以根据该字段进行排序,并动态生成排名。
答案 1 :(得分:0)
彼得给出的答案对许多情况都有好处,但如果有无限数量的分数(超过16MB /文件),请考虑以下链接
https://docs.mongodb.com/manual/tutorial/model-referenced-one-to-many-relationships-between-documents/
否则这是一个很好的方法:
https://docs.mongodb.com/manual/tutorial/model-embedded-one-to-many-relationships-between-documents/
答案 2 :(得分:-1)
这里我假设您的表(用户)看起来像:
用户=列(userId,得分) 创建名为as的单独表 user_audit =列(identifierPK,userId,得分,时间戳) 在用户表上写入触发器以填充用户审核历史记录。
在这里,您可以添加另一列用户表并跟踪其历史记录。
另一种选择是:
UserScoreAudit = columns(user_id,oldScore,newScore,timestamp)
通用审核表=列(actorId,oldValue,newValue,tableName,fieldName,timestamp)