Pet*_*son 3 couchdb non-relational-database nosql
假设我正在编写一个日志分析应用程序.主域对象是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
)
Run Code Online (Sandbox Code Playgroud)
使用CouchDB我首先尝试只有两种文档类型.我有一个LogEntry类型,看起来像这样:
{
'type': 'LogEntry',
'severity': 'DEBUG',
...
}
Run Code Online (Sandbox Code Playgroud)
我有一个LogTopic类型,看起来像这样:
{
'type': 'LogTopic',
'matching_entries': ['log_entry_1','log_entry_12','log_entry_34',....],
...
}
Run Code Online (Sandbox Code Playgroud)
您可以通过使用matching_entries每个LogTopic文档中的字段来存储LogEntry文档ID列表来查看我表示关系.这在某种程度上可以正常工作,但是当多个客户端都试图向主题添加匹配条目时,我遇到了问题.两者都尝试乐观更新,一个失败.我现在使用的解决方案是基本上重现RDBMS方法,并添加第三种文档类型,如:
{
'type':'LogTopicToLogEntryMap',
'topic_id':'topic_12',
'entry_id':'entry_15'
}
Run Code Online (Sandbox Code Playgroud)
这工作,并通过并发更新问题,但我有两个保留:
任何人都有更好的解决方案吗?如果我也发布了我正在使用的观点会有帮助吗?