我正在考虑将以下任一堆栈用于个人项目: Nodes.js / MongoDB(学习) Rails / Postgres(更熟悉) 我想尝试一下MongoDB用于学习目的,但我不确定它是否适合这个问题。我想听听基于以下问题描述的权衡和示例,一些具体问题在底部:
有一个产品清单,比如p1,p2,p3,每个产品都有一些环境影响的字段,比方说A,B,C。
p1 p2
+ +
| |
| |
+------------------+ +----+----+
| | | | |
+ + + + +
p3 p4 p5 p3 p6
+ + |
| | |
+-----+-+ +---+--+ +---+--+
+ + + + + +
p7 p8 p2 p9 p10 p11
p1.A = p3.A + p4.A + p5.A
p1.B = p3.B + p4.B + p5.B
p3.A = p7.A + p8.A
产品表看起来像这样
id A B C parents children
1 4 5 6 [] [3, 4, 5]
2 10 11 12 [4] [3, 6]
3 6 7 8 [1,2] [7, 8]
4 3 9 6 [1] [2, 9]
5 3 3 10 [1] [10, 11]
6 3 1 2 [2] []
7 4 5 0 [3] []
...
更新流程如下所示:
p1由p2和p3组成。
p2也由p3
组成如果p3 A,B或C更新,它将触发p1更新以重新计算其A,B,C,尽管可能仍具有旧的p2值。然后,当p3更新p2时,p2更新将再次触发p1更新。根据排序,更新中可能会有一些冗余操作。我猜这没关系。
由于环境影响不是关键数据,我只是看数据最终是一致的。
就规模而言,在某些时候可能会有成千上万的产品。
问题:
1)我需要在循环图中防止无限更新周期。
2)你能否轻松地在MongoDB中处理这种类型的双向关联,产品的父母是产品,孩子是产品。
3)我可以构建数据而不是父数组和子数组的不同方法有哪些,并有效地设计此更新过程。如果我设计它,当一个产品更新时,触发另一个更新,触发另一个更新并且链继续,这可能会导致长的Web请求周期?
感谢。
答案 0 :(得分:0)
您的模型最好被描述为有向图
G = (V,E) ; V->P ; E = VxV
因此,PostgreSQL或MongoDB都不适合您的用例。
与PostgreSQL等传统RDBMS相比,MongoDB的最大优势是MongoDB的动态模式。这意味着您可以添加具有各种结构的新记录,而无需重新定义数据库模式。
但是你描述的模型对我来说是非常静态的。所以这个论点并不能算你的问题。
就我而言,您的最佳技术决策是使用像Neo4j这样的图表数据库。
作为替代灵感,您可以查看图形数据结构。因此,对图表建模的一种有效方法是使用adjacency matrix。