我正在尝试规划一个 NOSQL 表架构。我的数据中有关系,但它们大多是关系数据库中的 N:N;很少有正常的 1:N 关系。
所以在这种情况下,我试图创建隐式关系,允许我从关系的两端进行浏览。我正在使用 Azure 表存储,所以我知道全文搜索不可用;我只能通过分区键 + 行键组合检索“对象”。
所以想象我有一个名为“People”的表和一个名为“Hamburgers”的表,表中的每个对象都可以与另一个表中的多个对象相关联。汉堡被很多人吃,每个人都吃很多汉堡。
由于这种关系可能偏重于人员方面 - 即每个汉堡包的人多于反之亦然,我会在这样的表格中处理这个问题:
汉堡桌
分区键:只有 1 个分区
行键:唯一 ID
人员表
分区键:只有 1 个分区
行键:唯一 ID
“列”:每个人吃的每个汉堡都有额外的价值
汉堡包-人桌
分区键:汉堡行键
行键:人员行键
这样,如果我正在查看一个汉堡包并想查看所有吃它的人,我可以转到 Hamburger-People 表并使用我的 Hamburger's Row Key 来获取所有吃汉堡包的人的分区。
如果我在一个人身上并想查看他/她吃的所有汉堡包,那么我对这个人吃的汉堡包的行键有额外的价值。
在向表中插入数据时,如果数据涉及汉堡包/人的关系,我会将这两个值插入到适当的表中,然后创建汉堡包-人表。如果我试图保留一个无重复的汉堡包列表,我需要先搜索汉堡包表以确保汉堡包不在那里(比如“Whopper” - 如果它在那里,我不会插入再次)。然后,我需要在 Hamburger-People 表中的汉堡包现有分区中插入一行。
但在大多数情况下,不存在重复要求。
这是一个很好的 NOSQL 模式的最佳实践方法,还是我以后会遇到问题?
更新另外,我希望以后能够对数据表进行分区,但我不确定如何使用这种结构进行分区;向 hamburger 表添加第二个分区需要我在 hamburger-People 表中存储一个额外的值,我不确定这是否会开始变得太复杂。