假设我有一个数据集,其状态如
company: {
name: "Foobar Inc.",
person: [{
name: "Brah Brah",
age: 47,
location: [35.0000, 115.0000]
}, {
name: "Hoge Hoge",
age: 24,
location: [24.0000, 130.0000]
}],
budget: 12000
}
但是age
,location
,budget
可能会随时间变化。
当我为此结构设计数据模型时,既要实时分发状态(例如,对于Web应用程序),又要从头到尾保持状态(例如,将公司的历史记录存储在数据库进行进一步分析),可能有两种存储更改的方法。
type Company @db(name: "company") {
id: ID! @id
name: String!
persons: [person!]! @relation (link: INLINE)
budget: [NumericTS!]!
}
type Person @db(name: "person") {
id: ID! @id
name: String!
age: [NumericTS!]!
location: [CoordinationTS!]!
}
type NumericTS @embedded {
number: Integer!
update: DateTime! @createdAt
}
type CoordinationTS @embedded {
location: [Integer!]!
update: DateTime! @createdAt
}
update
表中type Company @db(name: "company") {
id: ID! @id
name: String!
persons: [person!]! @relation (link: INLINE)
budget: Integer!
updates: [Update!]!
}
type Person @db(name: "person") {
id: ID! @id
name: String!
age: Integer!
location: [Integer!]!
}
type Update @embedded {
target: String! // "e.g., person.age"
integerUpdate: Integer // non-null allowed
coordinationUpdate: [Integer]
update: DateTime! @createdAt
}
比较两种方法,似乎如果要在特定时间检查状态,则前一种方法会更好。例如,假设有一个搜索栏,通过它可以不时地跳过以查看时间状态。使用后一种方法,如果单击“跳转到结尾”,则必须处理所有到结尾的更改以完成更新。
另一方面,如果需要处理状态的“时间序列”,则后一种方法可能是合适的。由于后一种模型的结构与状态的结构完全相同,因此仅更新表给出的一个突变就足以导出下一个状态。前一种方法具有各种属性的时间戳,因此,无法准确地找到更新发生的时间并逐一导出对应的状态。
但是我仍然认为,即使我采用前一种方法,使用GraphQL查询也可能很容易找到更新。这是正确的吗?考虑到所有这些,哪种方法存储这种类型的结构更好?