los*_*els 6 javascript sqlite json database-design angularjs
我目前正在构建一个非常复杂的AngularJS应用程序,它将数据存储在sqlite数据库中.我的应用程序数据包含对整个应用程序共享的对象的引用.Angular能够渲染这些数据,比较它,到目前为止一切都很好.
这一切是什么意思?查看此示例,了解我的应用程序中对象的"样板".
var Person = {
name:'some person',
owns:[]
}
var Cat = {
name:'some cat'
}
var project = {
name:'some project',
people:[],
cats:[]
}
Run Code Online (Sandbox Code Playgroud)
我的应用程序将允许用户创建和操作这些对象,并在它们之间创建关系.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.
Run Code Online (Sandbox Code Playgroud)
然后我的应用程序设置视图以查看每个视图person,并列出owns属性,其中包含实例Cat.
一切都很好,直到我意识到在数据库中将这个存储为JSON可能会有并发症.JSON.Stringify()并且angular.toJSON()不要将引用视为引用,而是将它们作为单个对象读取.
我希望获得一些关于保存这些关系/参考的最佳方法的见解.
以下是我相信的两个选项.
选项1: 废弃将其存储在JSON中的想法,并使用关系数据库来存储所有内容.这并不理想,因为它开始吞噬AngularJS中对象渲染的灵活性.此外,这些数据将存储在多个地方(在线和本地),这可能会在数据库方案中出现差异,这将是调试的噩梦.
选项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],
}
]
Run Code Online (Sandbox Code Playgroud)
嵌入的一个很好的例子可能是对项目的评论。在这种情况下,您始终可以通过项目访问评论。而且因为评论只能属于一个项目,所以嵌入它更有意义。
// projects.json
[
{
id: 4
name: 'homework',
person_ids: [1,2,3],
comments: [
{
person_id: 1,
message: 'My dog ate it'
]
]
}
]
Run Code Online (Sandbox Code Playgroud)
我建议阅读Mongoid如何处理关系。它是 MongoDB 的 ruby 包装器,但文档解释了它如何构建集合以启用关系。您可能会发现了解这将如何工作非常有帮助。