DynamoDB如何在模型c#

时间:2018-06-28 12:56:26

标签: c# asp.net-web-api orm amazon-dynamodb

我第一次使用DynamoDB,这是我第一次使用ORM。我正在尝试遵循使模型与控制器分离的良好实践。我正在使用的项目是Lambda的ASP.NET Web API

我已经编写了基本模型,如下所示

我有一个User类

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

我有一个Accounts类

[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);
}

注意:由于“帐户”中的“用户”对象,此代码当前无法使用。

1 个答案:

答案 0 :(得分:1)

作为我的答案的序言,我想参考此highly ranked answer来提醒您:”所有有关如何以“ NoSQL方式”存储多对多关联的答案都减少为相同事情:冗余存储数据。”

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

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

这取决于您正在运行的查询中的用户对象所需的信息。如果查询需要所有用户信息,则应存储完整的用户对象。如果查询仅需要知道用户是否存在,则可以使用用户名。

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

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

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

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

同样,我强烈建议阅读How do you track record relations in NoSQL?,以获取有关NoSQL环境中关系记录的更多信息。无论使用哪种NoSQL数据库(dynamodb,couchdb,cassandra等),以及使用哪种编码语言与数据库进行交互,其原理都是相同的。