DynamoDB 如何在模型 c# 中设置“外键”

达米安B

我有史以来第一次使用 DynamoDB,这是我第一次使用 ORM。我正在尝试遵循保持模型与控制器分离的良好做法。我正在使用的项目是用于 Lambda 的 ASP.NET Web API

我已经写了我的基本模型,它看起来像下面

我有一个用户类

[DynamoDBTable("Users")]
public class User
{
    [DynamoDBHashKey]
    public string username { get; set; }
    public string firstname { get; set; }
    public string surname { get; set; }

我有一个帐户类

[DynamoDBTable("Account")]
public class Account
{
    [DynamoDBHashKey]
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    [DynamoDBLocalSecondaryIndexRangeKey]
    public User User { get; set; }

我的帐户与用户相关联。现在我明白,就数据库而言,我只想存储用户的 ID(用户名)。但就我的模型而言。我应该存储用户对象还是只存储用户名?如果我应该存储 User 对象,我如何只保存 User 对象中的 Key 而不是整个对象。

最重要的是,如果我存储为一个完整的对象。我不希望客户端发布整个对象,他们只会发布用户名。控制器中的以下代码有意义吗?(注意:DBContext 是我的数据库包装器)

public void Post(Account NewAccount, String username)
{
    User user = DBContext.GetItem<User>(username);
    NewAccount.User = user
    DBContext.StoreAsync(NewAccount);
}

注意:由于帐户中的用户对象,此代码当前不起作用。

风筝编码器

作为我的回答的序言,我想遵循这个排名靠前的答案来提醒您:“有关如何以“NoSQL 方式”存储多对多关联的所有答案都归结为同一件事:冗余存储数据。

DynamoDB是一项 nosql 数据库服务,因此该声明适用。考虑到这一点,请记住有很多方法可以解决您的问题。在设计模型时:“在 NoSQL 中,您不是根据数据实体之间的关系设计数据库。而是根据将针对它运行的查询来设计数据库。” 您的模型不一定是“ORM”,因为您没有表示数据之间的关系。相反,您需要运行的查询类型应该是您如何表示数据的驱动决策因素。

我应该存储用户对象还是只存储用户名?

这取决于您需要从正在运行的查询中的用户对象获取的信息。如果您的查询需要所有用户信息,那么您应该存储完整的用户对象。如果查询只需要知道用户是否存在,那么用户名就可以了。

如果我应该存储 User 对象,我如何只保存 User 对象中的 Key 而不是整个对象?

这个问题有点矛盾,因为您想存储 User 对象,但又只想保存密钥。似乎您有一个仅保存下面的用户名的示例,我将在问题的下一部分中进一步讨论这个想法。

我不希望客户端发布整个对象,他们只会发布用户名。控制器中的以下代码有意义吗?

是 - 如果帐户查询只需要一个用户名来表示用户对象。如果您的帐户查询需要其他属性来表示用户对象,则您需要决定如何包含这些属性。如果您将多个用户属性保存到帐户模型,则必须牢记“在非规范化数据库或 NoSQL 中,编写应用程序代码以防止异常(不同步的冗余数据)成为您的责任。”

我再次强烈推荐阅读如何在 NoSQL 中跟踪记录关系?有关 NoSQL 环境中关系记录的更多信息。无论您使用哪种 NoSQL 数据库(dynamodb、couchdb、cassandra 等)以及您使用哪种编码语言与数据库交互,原理都是相同的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章