我们说我写日志的分析应用程序。主要领域对象将是一个LogEntry.除。该应用程序的用户定义LogTopic其中描述了什么日志条目,他们是感兴趣。作为应用程序接收的日志条目则增加了他们couchDB,还将检查它们针对所有LogTopics在系统来看,如果他们符合条件的话题。如果它不那么系统应当记录,进入相匹配的专题。因此,有许多对多关系之间的LogEntries和LogTopics.

如果我是储存在这一RDBMS我会做这样的:

CREATE TABLE Entry (
 id int,
 ...
)

CREATE TABLE Topic (
 id int,
 ...
)

CREATE TABLE TopicEntryMap (
 entry_id int,
 topic_id int
)

使用CouchDB我第一次尝试过只有两个文件的类型。我有一个LogEntry类型,寻找像这样的东西:

{
  'type': 'LogEntry',
  'severity': 'DEBUG',
  ...
}

我有一个LogTopic类型,寻找像这样的东西:

{
  'type': 'LogTopic',
  'matching_entries': ['log_entry_1','log_entry_12','log_entry_34',....],
  ...
}

你可以看到,我表示的关系通过使用 matching_entries 领域中的每个LogTopic文件储存的列表LogEntry文件。这工作好了一点,但我有问题当多的客户是试图添加一个匹配的条目,一个主题。这两个试图乐观的更新,以及一个失败。解,我现在使用的是基本上重现RDBMS的方法,并添加一个第三号文件的类型,是这样的:

{
  'type':'LogTopicToLogEntryMap',
  'topic_id':'topic_12',
  'entry_id':'entry_15'
}

这一工作,和获取过去的并发更新的问题,但我有两个保留:

  1. 我担心,我只是用这个 方法,因为它就是我想做的 一个关系数据库。我不知道,如果有的 更couchDB状(relaxful?) 解决方案。
  2. 我的看法可能不再 检索的所有条目的 特定的主题,在一个呼吁。我 以前的解决方案允许的,(如果我 使用的include_docs参数)。

任何人有一个更好的解决方案给我吗?我还发表的意见,我使用的?

有帮助吗?

解决方案

你的方法很好。使用CouchDB并不意味着你就只是放弃关系建模。你会需要同时运行两个查询,但这是因为这是一个"加入"。SQL queries有加入也是缓慢的,但SQL的语法可以让你快速查询在一个发言。

在我几个月的经验与CouchDB这是我的发现:

  1. 没有架构,因此设计的模型应用程序是快速和灵活的
  2. 污物是存在的,因此开发应用程序是快速和灵活的
  3. 再见SQL注射
  4. 什么将是一个SQL加入需要一点更多的工作,在CouchDB

这取决于你需要的我已经发现,couchdb-分类:设还有助于建设更为复杂的查询。

其他提示

我布这个问题的 couchdb用户的邮件列表 和内森斯托特 指出我 一个 非常有益的博客 由克里斯托弗*伦兹

我会尝试设立的关系,以便LogEntrys知道这LogTopics属于他们的地方。这样,插入一个LogEntry不会产生冲突的LogTopics不需要改变。

然后,简单地图的功能会发LogEntry一次为每个LogTopic它属于基本建设你的TopicEntryMap:

"map": function (doc) {
    doc.topics.map(function (topic) {
        emit(topic, doc);
    });
}

这种方式,查询视 ?key=<topic> 参数将会给你所有的项目都属于一个主题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top