DynamoDB中的用户数据模型

时间:2018-11-27 15:28:46

标签: c# .net amazon-web-services nosql amazon-dynamodb

在C#中,我目前正在使用DynamoDB尝试构建我的应用程序/平台,其中在一个文档中有3个模型:

  1. 公司
  2. 部门
  3. 员工

在下面的示例中,我将这些模型合并到一个项目中,我认为这是避免关系数据库实践的最佳实践。

但是,我的问题是当员工登录或注册时如何查询?用户名在整个平台(无论公司或部门)中始终是唯一的

  • 我需要根据用户名查找特定的员工(以进行比较 登录详细信息等,登录时)
  • 我需要知道什么时候有新员工注册,如果有员工 相同的用户名已经存在或不存在。

    {
    "CompanyID": "035129ab-4d60-42b0-8bba-a2f0860ca93c",
    "CompanyName": "Test Company",
    "CompanyAddress": "Test Address 22",
    "Departments": [
        {
            "DepartmentID": "3549aaab-f244-48a5-8e9b-d871357cfb47",
            "DepartmentName": "Seattle Department",
            "Employees": [
                {
                    "EmployeeID": "61dcdf81-571f-4a70-9020-161719120da6",
                    "EmployeeUsername": "JohnDoe",
                    "EmplyeeEmail": "John@Doe.com",
                    "EmplyeeFullName": "John Doe",
                    "EmployeePassword": "C78AEB71D55B194A1CBE22533823663B"  
                },
                {
                    "EmployeeID": "b70e29da-eba7-425a-ab4a-6b96ed479c52",
                    "EmployeeUsername": "FooBar",
                    "EmplyeeEmail": "Foo@Bar.com",
                    "EmplyeeFullName": "Foo Bar",
                    "EmployeePassword": "FF0F0C99A83829F0D24A1B1BDC2E7780"  
                }
            ]
        }
    ]
    

    }

这是最好的方法吗?有没有更好的办法?我将不胜感激任何帮助! :)

谢谢!

1 个答案:

答案 0 :(得分:0)

通常,我同意在NoSQL中存储关系数据这一概念,从表面上看,这样的单一文档方法是有意义的。但是,当您开始深入研究时,就会遇到很多问题。

对我来说,第一个也是最大的问题是查询数据的难易程度。在您的示例中,您的员工列表分布在多个文档中,并非常深地嵌套在文档中。这会使查询该信息非常困难(且缓慢)。许多NoSQL解决方案都提供了对子项的索引,但是即使正确配置也可能很复杂。

您显然可以调整嵌套的层次结构,并将Employee数据移至注释中提到的根级别。这样可以更轻松地查询雇员。但是,现在您正在复制数据。由于额外的数据,复制不是主要问题,它主要是数据一致性问题。如果您需要更新部门或公司的信息怎么办?您是否必须遍历每个员工文档并更新他们的部门?您是否在这些部门之间划分ID,以便您知道哪些相同?从数据库中获取数据后如何合并数据?

在此示例中,它绝对是关系数据。最好将其存储在关系数据库中。如果您担心可用性,可伸缩性等...为什么不使用Amazon RDS和Amazon Aurora?当然,与DynamoDB相比,入门成本会更高一些,但这将是关系数据的长期解决方案。

如果您设置使用DynamoDB,我会将数据存储在单独的表中。从长远来看,它将是最干净的。这意味着您在某些情况下需要查询多个表,但是您应该能够使用BatchGetItem来减轻这种情况,根据文档:

  

返回一个或多个表中一项或多项的属性

我希望这种见解能有所帮助。如有任何疑问,请随时发表评论,我会尽力回答!