【发布时间】:2013-12-31 11:14:42
【问题描述】:
我目前正在构建一个非常复杂的 AngularJS 应用程序,它将数据存储在 sqlite 数据库中。我的应用程序数据包含对整个应用程序共享的对象的引用。 Angular 能够渲染这些数据,进行比较,到目前为止一切都很好。
这一切是什么意思?查看此示例以了解我的应用程序中对象的“样板”。
var Person = {
name:'some person',
owns:[]
}
var Cat = {
name:'some cat'
}
var project = {
name:'some project',
people:[],
cats:[]
}
我的应用程序将允许用户创建和操作这些对象,并在它们之间创建关系。可以创建Person 的实例,并且每个Person 对象可以存储对Cat 实例的引用。
您可能已经猜到了,我的project 在用户完成操作后最终会是这个样子。
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.
然后我的应用程序设置了查看每个person 的视图,并将列出owns 属性,其中包含Cat 的实例。
一切都很好,直到我意识到将其作为 JSON 存储在数据库中可能会很复杂。 JSON.Stringify() 和 angular.toJSON() 不将引用视为引用,而是将它们视为单独的对象。
我希望对保留这些关系/参考的最佳方式有所了解。
这是我认为我有的两个选项。
选项 1: 放弃将其存储在 JSON 中的想法,并使用关系数据库来存储所有内容。这并不理想,因为它开始侵蚀 AngularJS 中对象渲染的灵活性。此外,这些数据将存储在多个位置(在线和本地),这可能会导致数据库方案存在差异,这将是调试的噩梦。
选项 2:
为Person 和Cat 的每个实例存储一个唯一标识符。然后我可以在渲染和创建关联时使用这个标识符。如果我在 Angular 中创建自定义过滤器,这将起作用,但在删除对象时全局删除引用可能是一场噩梦。
【问题讨论】:
-
我真的不知道这些 JSON DB 是如何存储它们的数据的,但是当您尝试序列化“Fred 拥有 Dino”和“Dino 由 Fred 拥有”时,您是否已经遇到了无限回归问题“?所以这甚至不是检索的问题,但似乎没有明确的方法来存储这些,除非数据库已经为你创建了引用......或者我错过了一些基本的东西?
-
你说得对,斯科特,我编辑了我的问题以反映你的担忧。在我的应用程序(以及上面的示例中)中,这是一种单向关系。不需要“owned_by”,一开始我错过了。
-
有了这个,我相信一些 JSON 存储引擎,如 Mongo 和 Couch 将存储足够的元数据,以便在检索您的
project对象时重建这些关系。但我不知道sqllite。他们不会检索的是您可能用来创建这些对象的任何构造函数。如果你只使用普通的 JS 对象,这根本不会受到伤害。 -
关于选项 2:你能解释一下吗? “如果我在 Angular 中创建自定义过滤器,这将起作用,但在删除对象时全局删除引用可能是一场噩梦。”
-
我自己也在考虑类似的问题。我也倾向于使用一些本地(或全球?)唯一 ID 的每个实例,但出于其他原因。本质上是为了鼓励分离客户端存储对象的关注点,以及计算任何派生数据的 OO 类型方法。例如,可能有 Cat 和 Person 服务,它们公开了 Cat.getOwnedBy(personId) 和 PersonService.getAge(personId) 等方法。每个服务将尽可能只处理其“类”的数据。
标签: javascript json sqlite angularjs database-design