Проектирование базы данных — нужна помощь в масштабировании запроса

#database #design-patterns #database-design #nosql #amazon-dynamodb

#База данных #проектирование-шаблоны #database-design #nosql #amazon-dynamodb

Вопрос:

Я пытаюсь найти лучшее решение для структуры данных / хранилища данных (с максимальной производительностью) для следующего запроса:

У меня есть список атрибутов, которые мне нужно сохранить для всех пользователей в США, например:

  ------------ ------- ------------- 
| Attribute  | Value |     SSN     |
 ------------ ------- ------------- 
| hair color | black | 123-45-6789 |
| eye color  | brown | 123-45-6789 |
| height     | 175   | 123-45-6789 |
| sex        | M     | 123-45-6789 |
| shoe size  | 42    | 123-45-6789 |
 

Как вы можете догадаться, в общей совокупности нет ничего уникального и идентифицируемого по этим атрибутам.
Однако давайте предположим, что если бы мы извлекали данные из комбинации 3 или 4 атрибутов, тогда я смог бы однозначно идентифицировать человека (найти его SSN).

Теперь вот трудности, набор комбинаций, которые могут однозначно идентифицировать человека, со временем будет развиваться и корректироваться.

Что было бы моим лучшим выбором для хранения и запроса данных в упомянутом выше сценарии, который будет оставаться высокопроизводительным (<100 мс) в масштабе?

Текущая попытка с объединением двух атрибутов:

 SELECT * FROM (SELECT * FROM people WHERE hair='black') p1 
JOIN (SELECT * FROM people WHERE height=175) p2 
ON p1.SSN = p2.SSN
 

Но с базой данных с миллионами строк, как вы можете догадаться .. НЕ работает.

Спасибо!

Комментарии:

1. просто интересно, но можете ли вы переключиться на Document DB?

2. Привет @DavidGuida, спасибо за ваш ответ. Я мог бы полностью переключиться на document DB. Решение для хранения данных не является ограничением, важна высокая производительность. Есть ли у вас какие-либо предложения о том, как вы могли бы разработать документ?

Ответ №1:

если хранилище данных не является ограничением, я бы использовал DocumentDB, что-то вроде MongoDB, CosmosDB или даже ElasticSearch.

Например, с помощью Mongo вы могли бы использовать его бессхемный характер и иметь коллекцию пользователей с одним свойством на «атрибут»:

 {
  "SSN": "123-45-6789",
  "eyeColor": "brown",
  "hairColor" "blond",
  "sex": "M"
}
 

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