Дизайн базы данных - вопрос об эффективности (и общем качестве дизайна) - PullRequest
1 голос
/ 04 октября 2010

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

1:

У меня есть таблица с именем ticket, в которой есть столбец с именем total.Когда итог обновляется, я хочу сохранить его (старый итог и т. Д.), Поэтому я решил удалить столбец total и создать таблицу с именем ticket_total со столбцами ticket_id, total и datetime (самый последний, конечно, «текущий» итог).

или

2:

Тогда я понял, что позже захочу дать своим клиентамвозможность сортировать тикеты по total или извлекать отчеты, которые агрегируют итоги и т. д. Итак, я решил вместо этого вернуть столбец total в ticket и изменить столбец total непосредственно, когда итогобновлен, но сначала создайте строку ticket_total как запись предыдущего total.

Кажется, что версия 2 будет очень эффективной, потому что мне не нужно запрашивать связанную таблицу ticket_total какмного, но мне интересно, что вы, DB-гуру, там думаете.Я просто изучаю дизайн базы данных и боюсь, что никогда не буду в этом хорош.

Ответы [ 4 ]

1 голос
/ 04 октября 2010

Re: «эффективность» - лучше всего не слишком беспокоиться об эффективности базы данных в начале проекта.Преждевременная оптимизация - распространенная ошибка, которую следует избегать.

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

Для небольших баз данных (десятки тысяч строк) даже «неэффективные» запросы часто выполняются очень быстро, учитывая сегодняшние серверы ипрограммное обеспечение.

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

Предложение У вас естьдва типа данных: информация о текущем билете и таблица истории для старых «итоговых» значений.

Таким образом, предпочтение будет отдано вашей версии 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?Убедитесь, что он проиндексирован.

1 голос
/ 04 октября 2010

Я бы предложил вариант 2, который вы предложили.

Просто убедитесь, что вы выполняете Обновление (заявки) + Вставка (в ticket_total) в транзакцию, чтобы обеспечить сохранение целостности.

1 голос
/ 04 октября 2010

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

0 голосов
/ 04 октября 2010

Я бы сделал ticket_total видом, а не таблицей. Я бы создал другое представление ticket_current, где я бы отфильтровал заявки по самой поздней дате, то есть если таблица заявок имеет двойной ключ для ticket_Id и datetime. Если нет, игнорируйте эту последнюю часть.

...