【问题标题】:DynamoDB how to set up "foreign keys" in model c#DynamoDB如何在模型c#中设置“外键”
【发布时间】:2018-12-07 13:46:00
【问题描述】:

我第一次使用 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; }

我有一个 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(用户名)。但就我的模型而言。我应该存储用户对象还是只存储用户名?如果我应该存储用户对象,我如何只保存用户对象中的密钥而不是整个对象。

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

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

注意:由于 Accounts 中的 User 对象,此代码当前无法运行。

【问题讨论】:

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


    【解决方案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 等)以及使用哪种编码语言与数据库交互,这些原则都是相同的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-17
      • 2018-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多