В Интернете есть много решений для настраиваемых полей: если это реляционная база данных, то большинство из них предполагает динамическое добавление столбцов, если это нереляционная база данных, вы можете напрямую использовать объект для ее хранения, но невозможно добавьте индексы к каждому полю, и эффективность запроса не гарантируется.
Здесь я поделюсь еще одной хитрой идеей, которая может не только гарантировать, что ее можно будет получить через настраиваемые поля, но и добиться высокой эффективности запросов. Мы используем комбинацию Redis и постоянной базы данных.
дизайн пространства имен Redis
Ключевой формат определяемого пользователем поля (User Defined Field, сокращенно udf), хранящегося в Redis:udf:filedName,Как показано ниже:
Соответствующая ему структура данных — хеш, поле — значение поля, а значение — список идентификаторов пользователей (разделенных запятыми).
Постоянные базы данных (mysql, postgresql, mongodb и т. д.) содержат строки JSON.
Нам нужно синхронизировать данные между Redis и mongo/mysql/postgres. Это не сложно, это включает только добавление, удаление и изменение полей, и этого достаточно для синхронизации обеих сторон.
Пример запроса
Сценарий 1: запрос на соответствие значений общего типа
запроситьfavorColour= "КРАСНЫЙ" для всех пользователей:
где ключ редисudf:favorColour
стоимость:
{
"RED": "用户ID 1",
"BLUE": "用户ID 2",
"BLACK": "用户ID 3,用户ID 4"
}
Шаги запроса следующие:
- hget udf:favorColour RED, временная сложность O(1)
- Если он существует, получить строку, разобрать строку в список идентификаторов пользователей и запросить связанных пользователей.
- Если он не существует, получить нуль, указывающий, что ни один пользователь не соответствует условию
Сценарий 2: значение типа коллекции в запросе
Опросить всех пользователей, чьи «профессиональные интересы» включают «информатику и технологии».
ключ Redisudf:interestedCourses
стоимость:
{
"计算机科学与技术": "用户ID1,用户ID2"
}
Шаги запроса следующие: (то же, что и выше)
-
hget udf:interestedCourses RED, временная сложность O (1) - Если он существует, получить строку, разобрать строку в список идентификаторов пользователей и запросить связанных пользователей.
- Если он не существует, получить нуль, указывающий, что ни один пользователь не соответствует условию
Сценарий 3. Запрос всех данных настраиваемых полей, принадлежащих пользователю
Здесь идентификатор пользователя проверяется непосредственно в базе данных, а временная сложность по-прежнему составляет O (1).После проверки строка может быть напрямую преобразована в JSON.