Дизайн базы данных - вопрос о эффективности (и общее качество проектирования)
-
27-09-2019 - |
Вопрос
Я боюсь, что я не знаю, что я делаю.
1:
У меня есть таблица под названием ticket
который имеет столбца под названием total
. Отказ Когда общая сумма обновляется, я хочу сохранить его (общую сумму и т. Д.), поэтому я решил удалить total
столбец и создать таблицу под названием ticket_total
с колоннами ticket_id
, total
, и datetime
(Самый последний из конечно - «текущий» всего).
или
2:
Затем я понял, что позже хочу дать своим клиентам возможность сортировать билеты total
, или потяните отчеты, которые заполняют итоги и т. Д. Итак, я решил вместо этого отложить total
колонна ticket
, и изменить total
столбец напрямую, когда общая сумма обновляется, но сначала создайте ticket_total
строка как запись предыдущего total
.
Похоже, что версия 2 была бы очень эффективной, потому что мне не нужно будет запрашивать связанные ticket_total
Таблица столько, но мне интересно, что вы туда задумали. Я просто изучаю дизайн базы данных и боясь, что я никогда не буду хорошо.
Решение
Я бы пошел с вариантом 2, который вы предложили.
Просто убедитесь, что вы выполняете обновление (билет) + вставить (в Ticket_Total) в транзакции, чтобы гарантировать, что целостность поддерживается.
Другие советы
Ваша вторая альтернатива быстрее, но если вы хотите создать отчеты о исторических значениях общего количества, вы должны иметь отдельную таблицу, где вы храните значение, которое вы заменяете вместе с временем временем. Этот тип таблицы называется аудиторская таблица.
Re: «Эффективность» - Лучше всего не беспокоиться о повышении эффективности базы данных в начале проекта. Преждевременная оптимизация - это распространенная ошибка, чтобы избежать.
Лучше сосредоточиться на ваших потребностях и дизайне к ним. Позже вы можете протестировать, чтобы увидеть, если где проходят узкие места работы и работают на их решении.
Для небольших баз данных (десятки тысяч строк), даже «неэффективные» запросы часто ходят очень быстро, данные сегодняшние серверы и программное обеспечение.
Будь проще Я предлагаю избежать комбинированных клавиш и перегрузки семантики таблицы, если у вас действительно нет необходимости.
Предложение У вас есть два типа данных: Информация о текущей билете и таблица истории для старых значений «Всего».
Таким образом, ваш Ver 2 будет предпочтительным.
ticket
id
field_a
field_b
total # current_total
ticket_total # history of ticket total field
id
ticket_id
total
create_time
Также «Всего» звучит как агрегация чего-либо. Я предлагаю вам попытаться придумать имя поля, которое более описательно. - Что такое поле в общей сложности? "total_worktime"?
Добавлен Не забудьте добавить индексы для таблиц. Индекс по всем, что вы используете для нахождения. Например, таблица билета есть Customer_ID? Убедитесь, что это проиндексировано.
Я бы сделал Ticket_total View, а не столом. Я бы создал еще один вид Mical_current, где я бы фильтровал билеты на последнюю дату, то есть если таблица билета двойной ключ на билетки ID_ID и DateTime. Если нет, не обращайте внимания на эту последнюю часть.