2015-05-28 2 views
0

Существует несколько таблиц в базе данных SQLite. Запросы данных (от клиента) можно запрашивать из таблицы, которая не существует. Если таблица существует, то требуемые данные из таблицы отправляются как массив строк, и если таблица не существует, то должен быть возвращен пустой массив .Что лучше, [Таблица Exests Check + Select] или [Select + Error Handling]?

Есть 2 способа (я могу думать):

  • Таблица Exists Check + Выбрать
  • Select + Обработка ошибок

Какой способ лучше (или быстрее)?

+1

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

+1

В условиях производительности решение 2º может быть лучше, потому что вы выбираете только один раз. –

+0

@Philipp это быстро, но таблицы в этом 'db' находятся в форме' date_DD_MM_YYYY' и постоянно создаются на 'INSERT' и падают на' DELETE'. – wolfram77

ответ

3

Это зависит от того, какой ваш случай по умолчанию. Если таблица будет существовать в большинстве случаев, используйте второй вариант. Как отметил в комментариях @CristianAbellira в комментариях, это также уменьшит нагрузку на базу данных, поскольку это еще одна транзакция.

Если, с другой стороны, вы ожидаете, что таблица не будет существовать большую часть времени, выполните некоторую проверку перед фактическим выбором. Это можно сделать с помощью вашего первого варианта, но мне также нравится идея от ответа Дэйвса.

+0

в большинстве случаев таблицы существовали бы в этом случае. – wolfram77

2

Я бы воспользовался третьей идеей.

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

Единственным недостатком является то, что пользователь создает новую таблицу во время сеанса.

В противном случае, если пользователь делает оператор SQL свободной формы, просто позвольте серверу выбросить нашу ошибку, а затем обработать ее с разумным сообщением об ошибке.

ДБ-двигатель, скорее всего, более эффективен, чем ваш код «Проверить таблицу существует». Если, конечно, вы не генерируете графику запроса, и в этом случае, вероятно, этот сценарий будет работать лучше всего (если у вас нет сотен таблиц).

Dave.

+0

, хотя таблицы будут медленно создаваться во время работы, за один раз можно удалить множество таблиц. однако идея кеша имен таблиц велика. – wolfram77

+0

@ wolfram77 от чтения одного из ваших комментариев, ваша проблема будет поддерживать обновленный кеш, если они быстро создаются на вставках.Если это так, то временные таблицы могут быть хорошим вариантом (поддерживает ли sqlite?) Поскольку они будут удалены при закрытии соединения. – DaveM

+0

Вставки должны быть не более 10/с. ранее не слышали временные таблицы, но данные не должны быть потеряны, если соединение потеряно. в настоящее время используется select с обработкой ошибок, как это предлагает Cristian & Andre. – wolfram77