Что лучше дополнительный запрос или дополнительный столбец в базе данных? - PullRequest
4 голосов
/ 13 ноября 2009

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

Пример: в случае управления субпользователями я либо добавляю один дополнительный столбец super_user_id в таблицу основных пользователей и делаю enrty, если типы пользователей являются sub_user и значение столбца по умолчанию равно -1, либо я создаю новую таблицу и управляю субпользователем в этой таблице .

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

Спасибо

Ответы [ 5 ]

1 голос
/ 13 ноября 2009

Нет общего ответа; вам нужно быть более конкретным. Все, что я могу предоставить, это общие принципы.

При прочих равных условиях вам будет лучше иметь хорошо нормализованную базу данных без избыточной информации по ряду причин. Но бывают ситуации, когда избыточная информация может сэкономить вашей программе много времени. Одним из примеров является текст, отформатированный с помощью Markdown: вам нужно сохранить исходную разметку, чтобы можно было редактировать ее, но форматирование источника каждый раз, когда вам нужно, может сильно обременять систему. Следовательно, вы можете добавить избыточный столбец для хранения форматированного вывода и взять на себя дополнительную ответственность за обеспечение актуальности этого столбца.

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

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

0 голосов
/ 13 ноября 2009

Используйте вторую таблицу. не потребует от вас двух запросов. Вместо этого вы выдадите один запрос, объединяющий две таблицы, или, что еще лучше, создайте VIEW, который выполнит JOIN для вас:

SELECT usertable.col1, usertable.col2 superusertable.superuserid
    FROM usertable LEFT OUTER JOIN superusertable 
    ON usertable.userid = superusertable.userid

Это позволяет вам поддерживать правильную нормализованную структуру, помогает вам в определенных запросах (например, выяснение, кто является суперпользователем) и позволяет базе данных оптимизировать проблемы поиска.

0 голосов
/ 13 ноября 2009

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

0 голосов
/ 13 ноября 2009

Выполнение дополнительного запроса всегда займет больше времени.

Добавление дополнительного столбца в БД не окажет существенного влияния, даже если у вас должно быть тысячи строк.

Ergo, добавить дополнительный столбец и сохранить трафик БД:)

0 голосов
/ 13 ноября 2009

Вы имеете в виду вычисление значения в вашем запросе вместо сохранения вычисленного значения?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...