论坛之类的数据结构:NoSQL合适吗?
Forum like data structure: NoSQL appropriate?
我正在尝试保存具有 "forum like" 结构的数据:
这是简化的数据模型:
+---------------+
| Forum |
| |
| Name |
| Category |
| URL |
| |
+---------------+
|1
|n
+---------------+
| |
| Thread |
| |
| ID |
| Name |
| Author |
| Creation Date |
| URL |
| |
+---------------+
|1
|n
+---------------+
| |
| Post |
| |
| Creation Date |
| Links |
| Images |
| |
+---------------+
我有多个 forums/boards。他们可以有一些线程。一个线程可以包含 n 个帖子(我只对线程包含的 link s、图像和创建日期感兴趣,以便进行数据分析)。
我正在寻找以这种结构保存和读取数据的正确技术。
虽然我过去大量使用 SQL 数据库,但我也有一些 NoSQL 项目(主要是基于 MongoDB 的文档)。
我确信 MongoDB 非常适合在这种结构中存储数据(论坛是文档,而线程是子文档。Posts 是线程中的子文档)。但是阅读它们呢?我有以下用例:
- 列出论坛中特定类别的所有帖子
- 在所有 datasets/documents
中的 Post 中找到特定的 link
哪种技术最适合这些用例?
请在下面找到我的解决方案草案。我已经考虑 MongoDB 用于以下设计。
Post Collection:-
"image" 应单独存储在 GridFS 中,因为 MongoDB collection 的最大大小为 16MB。您可以将图像的 ObjectId 存储在 Post collection.
{
"_id" : ObjectId("57b6f7d78f19ac1e1fcec7b5"),
"createdate" : ISODate("2013-03-16T02:50:27.877Z"),
"links" : "google.com",
"image" : ObjectId("5143ddf3bcf1bf4ab37d9c6e"),
"thread" : [
{
"id" : ObjectId("5143ddf3bcf1bf4ab37d9c6e"),
"name" : "Sam",
"author" : "Sam",
"createdate" : ISODate("2013-03-16T02:50:27.877Z"),
"url" : "https://www.wikipedia.org/"
}
],
"forum" : [
{
"name" : "Andy",
"category" : "technology",
"url" : "https://www.infoq.com/"
}
]
}
为了按类别访问数据,您可以在 "forum.category" 字段上创建索引。
db.post.createIndex( { "forum.category": 1 } )
为了通过链接访问数据,您可以在 "links" 字段上创建索引。
db.organizer.createIndex( { "links": 1 } )
请注意,索引不是强制性的。您也可以 access/query 没有索引的数据。如果您需要更好的读取性能,您可以创建索引。
我看到应用程序使用 MongoDB 来处理与您类似的用例。对于上述用例(或访问模式),您可以继续使用 MongoDB。
我正在尝试保存具有 "forum like" 结构的数据:
这是简化的数据模型:
+---------------+
| Forum |
| |
| Name |
| Category |
| URL |
| |
+---------------+
|1
|n
+---------------+
| |
| Thread |
| |
| ID |
| Name |
| Author |
| Creation Date |
| URL |
| |
+---------------+
|1
|n
+---------------+
| |
| Post |
| |
| Creation Date |
| Links |
| Images |
| |
+---------------+
我有多个 forums/boards。他们可以有一些线程。一个线程可以包含 n 个帖子(我只对线程包含的 link s、图像和创建日期感兴趣,以便进行数据分析)。
我正在寻找以这种结构保存和读取数据的正确技术。
虽然我过去大量使用 SQL 数据库,但我也有一些 NoSQL 项目(主要是基于 MongoDB 的文档)。 我确信 MongoDB 非常适合在这种结构中存储数据(论坛是文档,而线程是子文档。Posts 是线程中的子文档)。但是阅读它们呢?我有以下用例:
- 列出论坛中特定类别的所有帖子
- 在所有 datasets/documents 中的 Post 中找到特定的 link
哪种技术最适合这些用例?
请在下面找到我的解决方案草案。我已经考虑 MongoDB 用于以下设计。
Post Collection:-
"image" 应单独存储在 GridFS 中,因为 MongoDB collection 的最大大小为 16MB。您可以将图像的 ObjectId 存储在 Post collection.
{
"_id" : ObjectId("57b6f7d78f19ac1e1fcec7b5"),
"createdate" : ISODate("2013-03-16T02:50:27.877Z"),
"links" : "google.com",
"image" : ObjectId("5143ddf3bcf1bf4ab37d9c6e"),
"thread" : [
{
"id" : ObjectId("5143ddf3bcf1bf4ab37d9c6e"),
"name" : "Sam",
"author" : "Sam",
"createdate" : ISODate("2013-03-16T02:50:27.877Z"),
"url" : "https://www.wikipedia.org/"
}
],
"forum" : [
{
"name" : "Andy",
"category" : "technology",
"url" : "https://www.infoq.com/"
}
]
}
为了按类别访问数据,您可以在 "forum.category" 字段上创建索引。
db.post.createIndex( { "forum.category": 1 } )
为了通过链接访问数据,您可以在 "links" 字段上创建索引。
db.organizer.createIndex( { "links": 1 } )
请注意,索引不是强制性的。您也可以 access/query 没有索引的数据。如果您需要更好的读取性能,您可以创建索引。
我看到应用程序使用 MongoDB 来处理与您类似的用例。对于上述用例(或访问模式),您可以继续使用 MongoDB。