0

我打算写一个博客风格的应用程序,想知道我应该用什么来存储。

我打算使用 NoSql 解决方案,因为做 db schema 很无聊。而且我相信我可以使用 json 结构化数据完成大部分功能。

设计时有哪些注意事项?哪种 NoSql 技术更适合这个目的?

粗略看一下 mongo/couchdb 就可以了,我希望能得到一些基于经验的建议。

感谢你的帮助!

4

2 回答 2

1

MongoDB/CouchDB

我想两者中更容易开始的是MongoDB。它更像是老式的关系数据库,因为您可以向列添加索引或调用计数等操作。据我所知,在 CouchDB 中,您宁愿将 Map-Reduce 用于所有此类功能。在 CouchDB 中,索引是由所谓的views生成的。

MongoDB 也将数据库、表概念大致映射到 NoSQL(数据的两级访问),而 CouchDB 只知道一级(数据库)。

mytable = Connection().mydatabase.mytable # MongoDB
mytable.save(document)

mydb = couchdb.Server()['mydatabase'] # CouchDB
mydb.save(doc)

所以我猜一开始 CouchDB 可能有点难以理解,因为你必须按某种类型选择文档(或使用多个数据库,但我认为type人们使用的是一个额外的属性,请参阅David Zuelke 的这个演示文稿第 41 页

MongoDB 通常使用可以包含在编程语言中的 API(如果存在库,但它们适用于大多数语言)。然后这些调用以二进制格式发送到服务器。另一方面,CouchDB 使用 REST-API。

数据结构

您可以在网上四处寻找一些教程。他们真的经常解释一些关于博客的事情,因为博客是面向文档的数据的一个很好的例子。

让我们自己在这里看一下:您将有一个表(或者type如果您使用 CouchDB)用于您的帖子。每个帖子都可以有一个文本、一些标签、一个日期、评论。关于文档数据库的要点是,您可以将所有内容存储在文档旁边,并保存所有这些关系数据库具有的关系。

这意味着,我们可以像这样对我们的帖子进行建模:

{type: post,
 date: 2012-06-19 22:14:23,
 author: user1462192,
 text: Welcome to my blog,
 comments: [
    {author: Aufziehvogel,
     date: 2012-06-19 22:14:45,
     text: Hello!
    },
    {author: user1462192,
     date: 2012-06-19 22:14:45,
     text: Hello, too!
    }
 ],
 tags: [welcome, new, interesting]
}

所以这就是帖子的样子。

开发软件时您总是要做的事情。想一想,您将保存哪些数据。想想它是如何相关的。然后对于面向文档的数据库,您还必须考虑如何访问它。

有时您可能拥有不应保存为帖子本身的子元素的数据,因为它太大了。可能您不仅有作者的姓名,还有更多信息,例如年龄、注册日期……</p>

那么用户可能看起来像这样:

{name: Aufziehvogel,
 age: 21,
 registration: 2012-06-19,
 interests: [php, nosql, data-mining, foreign-languages]
}

您不希望将这些数据附加到每篇博客文章中,因为其中一些可能会更改并且因为它非常大。相反,您会(就像使用关系数据库一样)在您的后期数据中存储对用户的引用。然后,您必须像上面链接的演示文稿中给出的那样合并作者和博客文章(第 40-42 页)。这会将所需的作者与博客文章合并。

您还可以在其中保存作者姓名和 ID,以便能够显示姓名并生成 HTML 链接,而无需从数据库中获取“真实”作者。

证实

Zuelke 还表明,对于面向文档的 dbs,检查数据是否格式正确是应用程序的任务。在 MySQL 中,数据库可以执行许多任务(列、数据类型、长度、唯一键),但是当使用面向文档的 dbs 时,您必须在应用程序中自己完成(除了我认为 MongoDB 具有诸如唯一键之类的功能)。

这使得良好的代码结构也很重要,这样您就不必担心太多地方的数据格式。

我想可以说得更多,但我希望这是一个开始。

于 2012-06-19T20:30:27.887 回答
0

使用app42提供的NoSQL数据库。这里是如何使用app42 NoSQL。 http://api.shephertz.com/apis/storage.php

于 2013-09-17T11:46:47.827 回答