Модель пользовательских данных в DynamoDB - PullRequest
0 голосов
/ 27 ноября 2018

В 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 голосов
/ 27 ноября 2018

В целом, я согласен с концепцией, согласно которой при хранении реляционных данных в NoSQL подход с одним документом имеет смысл на первый взгляд.Однако, когда вы начинаете копаться в этом немного больше, вы сталкиваетесь с довольно большим количеством проблем.

Первый и самый большой для меня вопрос - насколько легко запрашивать данные.В вашем примере списки сотрудников распределены по нескольким документам, достаточно глубоко вложенным в документы.Это может усложнить (и замедлить) запрос этой информации.Многие решения NoSQL обеспечивают индексацию дочерних ключей, но даже это может быть сложно для правильной настройки.

Очевидно, что вы можете настроить иерархию вложенности и переместить данные Employee на корневой уровень, как вы упомянули в ваших комментариях.,Это значительно упростит запрос сотрудников.Однако сейчас вы дублируете данные.Дублирование не является серьезной проблемой из-за дополнительных данных, это главным образом проблема согласованности данных.Что делать, если вам нужно обновить информацию для отдела или компании?Нужно ли вам просматривать все документы сотрудников и обновлять их отделы?Вы разделяете идентификаторы между этими отделами, чтобы знать, какие из них одинаковы?Как объединить данные, как только вы получите их из базы данных?

Для этого примера это абсолютно реляционные данные.Лучшее место для его хранения - реляционная база данных.Если вас беспокоит доступность, масштабируемость и т. Д. Почему бы не использовать Amazon RDS и Amazon Aurora?Конечно, стоимость будет немного выше для начала, чем для DynamoDB, но это будет отличное долгосрочное решение для реляционных данных.

Если вы настроены на использование DynamoDB, я бы сохранил данныев отдельных таблицах.Это будет самым чистым в долгосрочной перспективе.Это будет означать, что в некоторых случаях вам нужно запрашивать несколько таблиц, но вы должны быть в состоянии уменьшить это, используя BatchGetItem , который согласно документации:

возвращает атрибуты одного илибольше предметов из одной или нескольких таблиц

Надеюсь, это понимание поможет.Если у вас есть какие-либо вопросы, пожалуйста, не стесняйтесь комментировать, и я сделаю все возможное, чтобы ответить!

...