我有史以来第一次使用 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] 删除。
我来说两句