【问题标题】:Storing an object-tree or flat-objects with references as JSON within localStorage在 localStorage 中以 JSON 形式存储对象树或平面对象
【发布时间】:2015-06-12 08:44:50
【问题描述】:

假设我有两个名为 Car 和 Wheel 的 JSON 对象。 Car 有一个 Wheel 集合,其余都是原始类型的属性。

汽车:

  • 姓名
  • 速度
  • 轮子

轮子:

  • 厚度
  • 摩擦

现在,如果我想用 localStorage 保存这辆车,我有两个选择。

  1. 我可以序列化包括车轮在内的汽车对象,并使用汽车名称作为 localStorage 中的键(保存整个对象树)。
  2. 我还可以保存汽车,不包括车轮。单独保存轮子并给轮子一个 Id 属性。然后将 Car 引用到车轮 ID 集合(使对象树变平)。

我在第一个解决方案中看到的缺点是,如果我在代码中重命名 wheel 属性,我将丢失以前存储的数据,而通过 Id 引用和检索单独的轮子则不会。另一方面,第二种解决方案更像是关系数据库,而不是 JSON 的面向对象。

我的问题是:对于这种存储,我最适合使用什么?为什么?

【问题讨论】:

    标签: json local-storage storage javascript-objects


    【解决方案1】:

    我也想过这个问题,测试了存储大列表和单独存储列表项的性能差异。我认为这足以为后来者提供一些建议。

    从性能角度来看,除非您始终知道 localStorage 的键并且一次只需要几个项目,否则序列化和存储整个对象树通常快 10 倍。

    考虑到localStorage的存储容量很小,而flat-objects需要一些额外的结构,flat-objects可以存储的内容实际上会变少。 Flat-objects 似乎通过共享项目来节省存储空间,但同样的事情可以在单个对象中完成,看看人们如何使用 Redux。

    此外,平面对象还需要克服“引用破坏”(来自用户)的风险,因此还需要垃圾收集功能。

    结论:存储整个对象。如果你坚持存储平面对象,甚至 IndexedDB 会更好。

    【讨论】:

    • 嗯,很有趣。你有这方面的基准吗?
    【解决方案2】:

    我认为您应该使用两种解决方案的一部分并有所作为,在哪里使用哪个选项:

    1. 将它们作为单独的对象保存到 localStorage(第二个选项),并且只在汽车对象中保留一个引用,这样您就可以保持它们干燥。然后,您可以在不丢失引用的情况下重命名代码中的属性,并且在将来。您仍然可以以更语义化的方式仅访问轮子以用于将来的某些目的。

    2. 在您的代码中进行抽象,在其中序列化和反序列化两个对象并将它们连接到那里(如您在第一个解决方案中所希望的那样)。所以 JSON 仍然是干净的,您将获得连接解决方​​案的所有优势。


    不幸的是,您当然知道,没有最好的选择。这很大程度上取决于您的直觉对数据未来的预测。抽象可以帮助你,因为大多数时候,当你以后可以重构某些东西时,你可能会

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-06
      相关资源
      最近更新 更多