@fdsfjo12e21

Дублирующиеся столбцы — это плохо?

Дублирующиеся столбцы - это плохо?

Объясню на примере, у меня есть 2 таблицы.
1 - это список всех клиентов.
2 - это список активных клиентов.

В списке активных клиентов есть дата активации, я разрабатываю статистику активных клиентов по датам, но такие запросы как INNER JOIN (для взаимодействия с датой активации между таблицами) замедляют скорость выполнения запроса, поэтому не будет ли считаться это костылем, если также и в списках всех клиентов будет дата активации?

В среднем на 1 запрос уходит 5-6 секунд с INNER JOIN.
В среднем на 1 запрос уходит меньше секунды без INNER JOIN (с учетом даты активации в списках всех клиентов).
  • Вопрос задан
  • 108 просмотров
Пригласить эксперта
Ответы на вопрос 4
rozhnev
@rozhnev
Fullstack programmer, DBA, медленно, дорого
Дупликация данных в двух таблицах - это плохо.
Столбец дата активации в таблице клиентов - это нормальное решение, пока клиент не активирован в ячейке - NULL
Ответ написан
@mletov
Не нужна таблица "Список активных клиентов"
Только таблица "Клиенты" и в ней "Дата активации" и "Дата деактивации"
Если дата деактивации пустая - клиент активен.
Если выборка "Список активных клиентов" используется часто - можно сделать вьюху.
Ответ написан
Комментировать
@res2001
Developer, ex-admin
5-6 секунд с inner join - это должно быть несколько миллиардов (сотен миллионов) записей в обоих таблицах.
Попробуйте создавать индексы по полям участвующим в связывании таблиц.
Денормализация данных - обычно плохой вариант. Есть некоторые кейсы, когда это допустимо, но лучше этого избегать, пока не перепробованы другие варианты ускорения.
Ответ написан
Комментировать
ThunderCat
@ThunderCat
{PHP, MySql, HTML, JS, CSS} developer
Объясню на примере, у меня есть 2 таблицы.
1 - это список всех клиентов.
2 - это список активных клиентов.
Это неверный подход. Для лучшего понимания советую почитать про нормальные формы бд.

Если коротко и сильно упрощенно - есть принцип, по которому все что можно узнать об объекте из 1 таблицы или поля, даже если для этого нужны какие-то манипуляции (например объединения таблиц или вычисления значений, например сумма/минимум/максимум) не должно дублироваться. В вашем случае у вас все решается дополнительным полем, которое будет однозначно отделять группу активных от неактивных, при этом дублирования данных не будет, все записи будут по прежнему уникальны.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы