Дизайн базы данных - вопрос о эффективности (и общее качество проектирования)

StackOverflow https://stackoverflow.com/questions/3852622

Вопрос

Я боюсь, что я не знаю, что я делаю.

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. Если нет, не обращайте внимания на эту последнюю часть.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top