0

我正在尝试规划一个 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 表中存储一个额外的值,我不确定这是否会开始变得太复杂。

4

1 回答 1

1

好的,很好的问题,我认为其中大多数是每个 RDMBS 开发人员在进入 NoSQL 世界时都会面临的问题:

1.如何对分区进行分组? 为了充分利用分区,您需要考虑数据库的负载应该分布在您的服务器上,让我们看看您的方法会发生什么

一个带有“A”键的人进入餐厅,您将保存它和他的汉堡,这是一个经典美味(“T”键),人员记录进入服务器 X,汉堡进入服务器 Y,现在是新客户go 用钥匙“B”进入,想要一些不同的东西,汉堡“W”,这个人再次去服务器 X,汉堡到服务器 X,这次服务器 X 正在承受所有负载,如果你重复这个你'会看到服务器 X 变成了瓶颈,因为 75% 的记录都流向那里(所有人和 50% 的汉堡),这会给你的负载带来一些问题。但是......当您尝试查询时问题会更好,因为所有查询都会到达服务器 X。为了解决这个问题,您可以使用人的键作为关系分区的一部分,

2. 我应该在 NoSQL 数据库中使用“关系”吗? 请记住,NoSQL 意味着只要您的问题需要解决方案以避免“过度查询”,您就可以复制信息,因此,如果您可以存储通常一起查询的信息,您将避免往返数据库。因此,如果您存储“事务”而不是“人和 burguers”,您将获得更好的性能并避免对数据库的一些打击,让我们用您的方法做一个真实数据的示例,并将其与“我的”方法进行比较:

  1. Joe Black 来到餐厅要一份美味,在这里您将进行以下交易: 创建 Joe Black 记录 创建 Burguer 交易记录

如果您想列出您的日常交易,您需要:

从“表”person-burguer 中获取当天的所有记录,然后转到“表”人并检索客户的姓名,现在,转到汉堡记录并检索他们的姓名。(您将无法进行跨表查询,因为某些记录可能在一台服务器中,而其他记录可能在第二台服务器中)

好的,如果您创建一个表“事务”并在其中存储以下 json 怎么办:

{ custid: "AAABCCC", name: "Joe", lastName: "Black", date: "2012/07/07", order: { code: "Burger0001", name: "Tasty", price: 3.5 } }

我知道您将有几条具有相同“美味”描述的记录,这是反规范化,当您使用 NoSQL 解决这些类型的问题时非常有用,现在,您创建了多少事务来将信息存储到数据库中?只有一个!哇...在一天结束时您需要多少查询才能检索信息?再一次...只是一个,它会产生一些问题,但也会为您节省很多工作,例如...您可以轻松地重新打印订单吗?(是的,你可以!)如果客户的名字发生了变化怎么办?这甚至可能吗?

我希望这对你有所帮助,

我是http://djondb.com的创建者,所以我认为根据数据库能够做什么,拥有内部知识会给我一种不同的方法来解决问题,但我不知道 azure 将如何处理如果您无法查询文档值和行键,则查询,但无论如何我希望这能让您有所了解。

于 2012-07-09T02:05:24.617 回答