javascript - 在 JSON 中存储对象引用

标签 javascript json sqlite angularjs database-design

我目前正在构建一个非常复杂的 AngularJS 应用程序,它将数据存储在 sqlite 数据库中。我的应用程序数据包含对在整个应用程序中共享的对象的引用。 Angular 能够呈现这些数据,对其进行比较,到目前为止一切都很好。

这一切是什么意思?查看此示例以了解我的应用程序中对象的“样板”。

var Person = {
    name:'some person',
    owns:[]
}

var Cat = {
    name:'some cat'
}

var project = {
    name:'some project',
    people:[],
    cats:[]
}

我的应用程序将允许用户创建和操作这些对象,并在它们之间创建关系。可以创建 Person 的实例,并且每个 Person 对象可以存储对 Cat 实例的引用。

您可能已经猜到了,在用户完成操作后,我的项目最终将看起来像这样。

var project = {
    name:'some project',
    people:[person, person, person],
    cats:[cat, cat cat, cat, cat, cat]
}

console.log(project.people[0].owns)
//logs something like "cat, cat, cat". These are references.

我的应用程序然后设置 View 以查看每个 person 并将列出 owns 属性,其中包含 Cat 的实例。

一切都很好,直到我意识到将其作为 JSON 存储在数据库中可能会很复杂。 JSON.Stringify()angular.toJSON() 不将引用视为引用,而是将它们作为单独的对象读取。

我希望获得一些关于保存这些关系/引用的最佳方式的见解。

这是我认为我有的两个选择。

选项 1: 放弃将其存储在 JSON 中的想法,并使用关系数据库来存储所有内容。这并不理想,因为它开始侵 eclipse AngularJS 中对象呈现的灵 active 。此外,此数据将存储在多个位置(在线和本地),这可能会在数据库方案中出现差异,这将是调试的噩梦。

选项 2:PersonCat 的每个实例存储一个唯一标识符。然后我可以在渲染和创建关联时使用这个标识符。如果我在 Angular 中创建自定义过滤器,这将起作用,但在删除对象时全局删除引用可能是一场噩梦。

最佳答案

传统的基于表的关系数据库已经解决了这个问题。可以在多个上下文中引用的每个记录/文档都存储在它自己的表/集合中,带有 id。该 id 被其自己集合中的其他对象引用。

JSON 本身只会保存原始数据,因此正如您所注意到的,发生变化的对象引用不是 JSON 可以处理的。

那么问题就变成了,数据是一阶对象之间的关系吗?还是嵌套/嵌入到另一个对象中?

在你的例子中,一个项目有很多人,一个项目有很多猫,人有很多项目。因此,因为人和项目都需要被多个其他对象引用,所以每个资源都应该是它自己的资源,由外键引用。

// projects.json
[
  {
    id: 4
    name: 'homework',
    person_ids: [1,2,3],
  }
]

// people.json
[
  {
    id: 1,
    name: 'Bob',
    project_ids: [4,5,6],
  }
]

嵌入的一个很好的例子可能是对项目的评论。在这种情况下,您总是通过项目访问评论。因为一条评论只能属于一个项目,所以嵌入它更有意义。

// projects.json
[
  {
    id: 4
    name: 'homework',
    person_ids: [1,2,3],
    comments: [
      {
         person_id: 1,
         message: 'My dog ate it'
      ]
    ]
  }
]

我建议您阅读如何 Mongoid handles relations .它是 MongoDB 的 ruby​​ 包装器,但文档解释了它如何构造集合以启用关系。您可能会发现了解它的工作原理非常有帮助。

关于javascript - 在 JSON 中存储对象引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20553740/

相关文章:

javascript - 如何在 node.js 中将一个 json 数组数据插入到 mysql 中?

sqlite - SQLite:对整数值使用数学运算符截断

python - 如何检查 SELECT 语句的 SQLite 游标结果是否为空?

SQLITE如何在同一查询中划分两个计数结果

javascript - WebRTC 和 ThreeJS 创建拉丝金属纹理立方体

javascript - 按类(矢量)获取图层,然后使用 Openlayer 2.14 刷新不起作用

对象 "like"Filter 的 JavaScript 一维数组

javascript - 在 jQuery 中向变量添加值的问题

python - 使用 matplotlib 从 JSON 绘制数据的最简单方法?

android - Lottie 动画填充