我第一次使用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);
}
注意:由于“帐户”中的“用户”对象,此代码当前无法使用。
答案 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等),以及使用哪种编码语言与数据库进行交互,其原理都是相同的。