我目前正在构建一个非常复杂的 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:
为 Person
和 Cat
的每个实例存储一个唯一标识符。然后我可以在渲染和创建关联时使用这个标识符。如果我在 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/