2010-10-04 3 views
1

Боюсь, я не знаю, что делаю.Дизайн базы данных - вопрос об эффективности (и общем качестве дизайна)

1:

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

или

2:

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

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

ответ

1

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

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

+0

спасибо. В настоящее время я использую '@ transaction.commit_on_success' Django для переноса метода, который создает обе записи. Как вы думаете, № 2 является «хорошей» практикой проектирования БД в целом. У меня есть полная гибкость, чтобы изменить его, если нет. – orokusaki

0

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

1

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

+0

Спасибо, Герт. Я не знал, что это стандартная практика. Это заставляет меня чувствовать себя лучше о себе, чтобы знать, что я случайно реализовал стандарт :) – orokusaki

1

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"?

Added Не забудьте добавить индексы для таблиц. Индекс тем, что вы используете для находок. Например, у таблицы билетов есть customer_id? Убедитесь, что он проиндексирован.

+0

спасибо :) 'total' действительно звучит довольно общий, не так ли. Особенно, если учесть, что в таблице 17 столбцов. – orokusaki