HTML5本地数据存储,以及在设备之间的同步

8
我正在构建一个全功能的Web应用程序。当您处于“离线”模式时,可以将数据保存到本地数据存储区。我希望能够在多台设备之间同步,这样人们就可以在一台机器上工作、保存,然后在另一台机器上加载他们的内容。
问题是:
1)在服务器上存储json是否是一个不好的主意?为什么要在服务器上解析json成模型对象,而它只会作为json传递回客户端?
2)我不确定是否想尝试NoSql技术来实现这个功能。目前我没有分解json,除了用户数据,数据库中的领域模型将是一个字符串,即json。欢迎提供建议。
理论上,在未来我可能想在服务器上进行一些处理或设置更复杂的关系。换句话说,现在我只会保存json,但在将来我可能需要更传统的关系系统。NoSQL方法会阻碍这一点吗?
3)这是否存在任何安全问题?例如JS注入?从理论上讲,对于这种情况,用户不能输入任何东西,至少目前是这样。
谢谢您的帮助。

我认为你不需要大量数据来考虑使用noSQL解决方案。我认为你应该根据工具的特点选择适合工作的工具。在这种情况下,CouchDB可能是完美的选择,因为它具有强大的复制和离线处理功能。 - rwilliams
@rwilliams -- 是的,我同意。我的问题是:“NoSQL存储是否是存储JSON的正确技术”?还有其他问题。 - hvgotcodes
JSON 是 CouchDB 用来存储文档的格式,所以我可以肯定地说它绝对是存储 JSON 的正确技术 :P - rwilliams
@rwilliams,不想写详细的答案吗? - hvgotcodes
已添加答案。理想情况下,我想了解更多关于您正在构建的应用程序和目标用户群体的信息。 - rwilliams
显示剩余3条评论
3个回答

3
  1. 如果大部分处理都将在客户端使用JavaScript完成,直接将JSON存储在服务器上是没有问题的。

  2. 如果你只是想尝试新技术,那么可以尝试一些不同的东西,但对于大多数应用程序来说,没有真正的理由离开传统数据库,SQL使生活变得简单。

  3. 只要使用标准的JSON.parse函数解析JSON字符串,就可以保证安全 - 一些浏览器(例如Firefox 3.5及以上版本)已经有了本地版本,而Crockford的json2.js可以在其他浏览器中复制此功能。


当你有大量数据并且实际上注意到传统数据库正在影响你的性能时,这几乎从不会发生,除非例如你是谷歌。即使 Facebook 也仅使用 MySQL 数据库与 memcached 来提高性能。 - casablanca
在赏金结束之前,是否有任何更新,基于其他答案? - hvgotcodes
@hvgotcodes:我想唯一仍然有疑问的是第二部分,至少在这种情况下,它有些主观/基于个人偏好。 “答案”就是你认为最适合你的选择。 :) - casablanca

3

服务器上的JSON

在服务器上存储JSON并不是一个坏主意,特别是如果你选择像MongoDB或CouchDB这样的noSQL解决方案。两者都使用JSON作为其本地格式(MongoDB实际上使用BSON,但它非常相似)。

noSQL方法:以CouchDB为存储引擎

  • 内置复制和并发处理
  • 非常简单的Rest API,使用HTTP与数据库交互。
  • 原生地将数据存储为JSON而不是blob或文本字段
  • 强大的视图/查询引擎,将允许您继续增加文档的复杂性
  • 离线模式。如果没有网络连接,您可以直接使用JavaScript与CouchDb通信,并使整个应用程序继续在客户端运行。

安全性

确保使用浏览器的JSON.parse或一个安全的Javascript库(json2.js)来解析JSON文档。

结论

我认为我建议在这里选择noSQL,特别是CouchDB,是因为它将为您处理所有困难的事情。复制将很容易设置。您不必担心并发等问题。

话虽如此,我不知道你正在构建什么样的应用程序。我不知道您与客户的关系以及让他们在机器上安装CouchDB有多容易。

链接

  1. Apache的CouchDB
  2. CouchOne
  3. CouchDB权威指南
  4. MongoDB

更新:

查看应用程序后,我认为CouchDB不会是一个好的客户端选项,因为您不需要要求用户安装数据库引擎来玩数独。话虽如此,我仍然认为它是一个很棒的服务器端选项。如果您想将服务器端的CouchDb实例与客户端同步,可以使用类似BrowserCouch这样的东西,它是本地存储的CouchDB的JavaScript实现。


@rwilliams,如果数据以json格式存储,运行服务器端批处理作业来分析数据的过程是什么样的?你只需要加载、解析并继续前进吗?我打算使用html5本地存储来保存客户端数据。除了couchdb之外,它如何工作?难道它不是二选一的吗? - hvgotcodes
为了分析事物,您可以使用CouchDB的视图引擎编写map或map/reduce函数。该函数会持续地应用于数据库中创建和更新的所有文档。该函数将创建一个B树索引,其中包含您选择的键和值。**除非您真的希望人们能够离线玩游戏,否则我认为这可能是二者之一。如果您想要在CouchDB之外使用本地数据,您可以使用BrowserCouch,然后将数据同步到服务器进行处理。我之前提到的map函数也可以在BrowserCouch中完成。 - rwilliams
@rwilliams,NoSQL方法的缺点是什么?请提供一些权衡来作出更全面的回答。 - hvgotcodes
缓慢的即席查询/视图。较小的社区支持/问题。平面命名空间,没有“表格”。较大的数据库文件,因为它使用copy_on_write(可以通过定期压实来缓解)。文档之间没有真正的关系,你必须通过视图引擎来关联文档。 - rwilliams
@rwilliams,嗯,如果在服务器上存储JSON,最好使用NoSQL,因为可以“查看”数据。使用关系型数据库管理系统(RDBMS)需要处理JSON才能分析它。这是正确的吗? - hvgotcodes
正确。使用关系型数据库管理系统,您必须将JSON转换为对象,然后开始分析它。除非您将分析结果存储在其他地方,否则每次想要分析数据时都必须执行此过程。另外,CouchDB视图引擎将在每个文档更改时逐步更新视图,因此您的分析查询将非常快速,几乎不需要任何处理。 - rwilliams

2
我刚读了你的帖子,我必须说我非常喜欢你的方法,这预示着许多Web应用程序在未来可能的工作方式,既有本地存储元素(用于断开状态),又有在线存储(主数据库 - 将所有客户记录保存在一个地方并同步到其他客户端设备)。
以下是我的答案:
1)在服务器上存储JSON:如果您的应用程序非常简单,则可以将对象存储为JSON,但这将阻碍使用数据(例如运行报告并通过批处理作业发送电子邮件)。我更喜欢自己使用JSON传输信息,并使用SQL数据库进行存储。
2)NoSQL方法:我认为你已经回答了自己的问题。如果不需要额外的资源,则我首选的方法是现在设置SQL数据库,这样您将节省一些设置NoSQL数据访问层所需的工作,因为您可能将来不得不删除它。如果您不想要完全功能齐全的RDBMS,则SQLite是一个不错的选择。
如果编写模式太麻烦,并且仍然希望在服务器上保存JSON,则可以使用单个表和一些服务器端解析来混合JSON对象管理系统以返回相关记录。这样做会更容易,并且需要比保存/删除文件更少的权限。
3)安全性:您提到目前没有用户输入:
“对于此用例,用户不能输入任何内容”
但是在问题的开始处,您还提到用户可以
“在一台机器上工作,保存,然后在另一台机器上加载他们的东西”
如果是这种情况,则您的应用程序将存储用户数据,无论您是否为他们提供了漂亮的GUI,都不重要,您将不得不从多个方面担心安全性,并且JSON.parse或类似工具仅解决了一半问题(客户端)。
基本上,您还必须检查服务器上POST请求的内容,以确定发送的数据是否有效和现实。在保存到数据存储之前,必须在服务器上验证JSON对象的完整性(使用php或其他类似语言),因为即使您没有打算这样做,某人也可以轻松地绕过您的javascript层“安全性”并篡改POST请求,然后您的应用程序将向客户端发送邪恶的输入。
如果您已经整理好了服务器端的事情,那么JSON.parse在防止JS注入方面有点过时。如果您依赖远程网站API获取一些数据,则额外的层还不错。
希望这对您有用。

在赏金结束之前,是否有任何更新基于其他答案? - hvgotcodes
@hvgotcodes也建议使用简单的关系型数据库解决方案,只需一个表格存储JSON数据。 - Steven de Salas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接