gpt4 book ai didi

Azure 表存储逆关系

转载 作者:行者123 更新时间:2023-12-03 00:52:49 24 4
gpt4 key购买 nike

我正在使用 Azure 表存储(注意:不是 Azure SQL),并且遇到以下情况:

在我的应用程序中,我有许多“邀请”用户的组织,并且邀请上有关联的“角色”和“到期”。一旦组织邀请了用户,我希望该组织能够看到他们已邀请的用户列表,并且我希望用户能够看到他们已被邀请加入的组织列表。

我认为在我的应用程序和本例中,数量会很少(即一个组织只会邀请几个用户,而一个用户通常只会被一个组织邀请)。但是,即使数量非常大,人们是否也可以使用通用模式来处理这种情况?

最佳答案

我目前使用三种方法,具体取决于我的需要:

交易

我将正向和反向关系存储在同一分区上...这意味着每个实体都位于同一分区上(即此方法受单个分区的速率限制),但这意味着您可以使用批量事务来同时插入正向和反向关系,这意味着您知道它们永远是正确的。

public class OrganisationInvite : TableEntity
{
// Partition Id - string.Empty
// Row Id - "Invite_" + OrangisationId + "_" + UserId

public string Role { get; set; }
public DateTime Expiry { get; set; }
}

public class OrganisationRequest : TableEntity
{
// Partition Id - string.Empty
// Row Id - "Request_" + UserId + "_" + OrganisationId

public string Role { get; set; }
public DateTime Expiry { get; set; }
}

要查询,我使用 t.RowKey.StartsWith("Request_...")t.RowKey.StartsWith("Invite_..."),具体取决于关于我是否想要获取用户/组织邀请的列表。

我想当数据非常关键时最好使用它。

最终一致性

我为两个表提供了所有属性,但它们位于不同的分区上,这为您提供了出色的可扩展性,但您失去了事务。我使用消息队列来更新反向关系以匹配正向关系,因此最终数据将匹配。 (但有一段时间可能不会)。

// Assume both in the same table, thus the prefix on partition
public class OrganisationInvite : TableEntity
{
// Partition Id - "Invite_" + OrangisationId
// Row Id - UserId

public string Role { get; set; }
public DateTime Expiry { get; set; }
}

public class OrganisationRequest : TableEntity
{
// Partition Id - "Request_" + UserId
// Row Id - OrganisationId

public string Role { get; set; }
public DateTime Expiry { get; set; }
}

要查询,我使用 t.PatitionKey == "Request_..."t.PatitionKey == "Invite_..." 取决于我是否想要获取用户/组织邀请的列表。也许您会认为其中之一是“事实来源”,因此当用户接受邀请时,您将查找“事实来源”并为用户授予该角色等。

这是最具可扩展性的解决方案,如果您在其之上使用缓存,则尤其有意义。

事实来源

在这种情况下,我只给出一个实体的属性,而另一个实体上只有逆关系的键。您可以将实体添加到最长或查询最多的列表中...在这种情况下,我会说它是组织的邀请。与最终一致性方法一样,您可以对逆关系进行排队以添加逆实体。此方法为您提供完整的数据一致性,除非您添加新关系(因为创建逆关系之前有一些时间),并且具有高度可扩展性 - 但读取逆列表的成本较高。

 // Assume both in the same table, thus the prefix on partition
public class OrganisationInvite : TableEntity
{
// Partition Id - "Invite_" + OrangisationId
// Row Id - UserId

public string Role { get; set; }
public DateTime Expiry { get; set; }
}

public class OrganisationRequest : TableEntity
{
// Partition Id - "Request_" + UserId
// Row Id - OrganisationId
}

您可以使用t.PatitionKey == "Invite_..."简单地查询转发关系。不过,反比关系并非微不足道。您必须使用 t.PatitionKey == "Request_..." 进行查询,并创建 n 个并行调用来获取每个项目的数据转发数据(在本例中使用在逆向中找到的组织 ID)关系的 RowKey)。如果该项目不存在,那么您不会将其添加到最终列表中。这确保了如果组织更改其角色,例如用户将在下一次点击时看到此更改。

如果很少使用逆关系,并且数据是最新的至关重要(我在考虑用户权限等?),我认为此方法很有用

关于Azure 表存储逆关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14792890/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com