代表一个多对多关系在couchDB
-
10-07-2019 - |
题
我们说我写日志的分析应用程序。主要领域对象将是一个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'
}
这一工作,和获取过去的并发更新的问题,但我有两个保留:
- 我担心,我只是用这个 方法,因为它就是我想做的 一个关系数据库。我不知道,如果有的 更couchDB状(relaxful?) 解决方案。
- 我的看法可能不再 检索的所有条目的 特定的主题,在一个呼吁。我 以前的解决方案允许的,(如果我 使用的include_docs参数)。
任何人有一个更好的解决方案给我吗?我还发表的意见,我使用的?
解决方案
你的方法很好。使用CouchDB并不意味着你就只是放弃关系建模。你会需要同时运行两个查询,但这是因为这是一个"加入"。SQL queries有加入也是缓慢的,但SQL的语法可以让你快速查询在一个发言。
在我几个月的经验与CouchDB这是我的发现:
- 没有架构,因此设计的模型应用程序是快速和灵活的
- 污物是存在的,因此开发应用程序是快速和灵活的
- 再见SQL注射
- 什么将是一个SQL加入需要一点更多的工作,在CouchDB
这取决于你需要的我已经发现,couchdb-分类:设还有助于建设更为复杂的查询。
其他提示
我布这个问题的 couchdb用户的邮件列表 和内森斯托特 指出我 一个 非常有益的博客 由克里斯托弗*伦兹
我会尝试设立的关系,以便LogEntrys知道这LogTopics属于他们的地方。这样,插入一个LogEntry不会产生冲突的LogTopics不需要改变。
然后,简单地图的功能会发LogEntry一次为每个LogTopic它属于基本建设你的TopicEntryMap:
"map": function (doc) {
doc.topics.map(function (topic) {
emit(topic, doc);
});
}
这种方式,查询视 ?key=<topic>
参数将会给你所有的项目都属于一个主题。