针对对象的GraphQL模式设计,其值的一部分可能随时间变化

时间:2019-07-04 05:30:00

标签: javascript database-design graphql

假设我有一个数据集,其状态如

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
}

但是agelocationbudget可能会随时间变化。

当我为此结构设计数据模型时,既要实时分发状态(例如,对于Web应用程序),又要从头到尾保持状态(例如,将公司的历史记录存储在数据库进行进一步分析),可能有两种存储更改的方法。

  1. 将更改存储在每个属性中
    此方法将包含每个属性中的更改,从而使其成为一个由相应的值和时间戳组成的数组。
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
}
  1. 将所有更改存储在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查询也可能很容易找到更新。这是正确的吗?考虑到所有这些,哪种方法存储这种类型的结构更好?

0 个答案:

没有答案