在C#中,我目前正在使用DynamoDB尝试构建我的应用程序/平台,其中在一个文档中有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"
}
]
}
]
}
这是最好的方法吗?有没有更好的办法?我将不胜感激任何帮助! :)
谢谢!
答案 0 :(得分:0)
通常,我同意在NoSQL中存储关系数据这一概念,从表面上看,这样的单一文档方法是有意义的。但是,当您开始深入研究时,就会遇到很多问题。
对我来说,第一个也是最大的问题是查询数据的难易程度。在您的示例中,您的员工列表分布在多个文档中,并非常深地嵌套在文档中。这会使查询该信息非常困难(且缓慢)。许多NoSQL解决方案都提供了对子项的索引,但是即使正确配置也可能很复杂。
您显然可以调整嵌套的层次结构,并将Employee数据移至注释中提到的根级别。这样可以更轻松地查询雇员。但是,现在您正在复制数据。由于额外的数据,复制不是主要问题,它主要是数据一致性问题。如果您需要更新部门或公司的信息怎么办?您是否必须遍历每个员工文档并更新他们的部门?您是否在这些部门之间划分ID,以便您知道哪些相同?从数据库中获取数据后如何合并数据?
在此示例中,它绝对是关系数据。最好将其存储在关系数据库中。如果您担心可用性,可伸缩性等...为什么不使用Amazon RDS和Amazon Aurora?当然,与DynamoDB相比,入门成本会更高一些,但这将是关系数据的长期解决方案。
如果您设置使用DynamoDB,我会将数据存储在单独的表中。从长远来看,它将是最干净的。这意味着您在某些情况下需要查询多个表,但是您应该能够使用BatchGetItem来减轻这种情况,根据文档:
返回一个或多个表中一项或多项的属性
我希望这种见解能有所帮助。如有任何疑问,请随时发表评论,我会尽力回答!