2010-11-06 3 views
3

У меня есть MySQL таблицы:MySQL: Разделение является хорошим способом обработки удалений?

CREATE TABLE responses (
    id INT NOT NULL AUTO_INCREMENT, 
    other_id INT NOT NULL, 
    details TEXT, 
    deleted BOOLEAN, 
    PRIMARY KEY (id) 
); 

Пользователи могут удалять записи в responses.

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

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

PARTITION BY LIST(deleted) (
    PARTITION pActive VALUES IN (0), 
    PARTITION pDeleted VALUES IN (1) 
); 

Мой вопрос будет это сделать акт удаления медленнее? Теперь, когда я изменяю «удаленное» поле записи, MySQL должен переместить запись в совершенно другой раздел. Кажется, что это может быть медленным.

Любые предложения были бы весьма полезными.

ответ

3

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

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

3

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

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

Но я бы избегал удаленных флагов. В проекте, над которым я работал, он просто стал настоящей головной болью. Например, что делать, если кто-то пытается вставить другую запись, точно такую ​​же, как та, которая была «удалена» (удаляется здесь означает, что удаленный флаг является истинным). Устанавливаете ли вы удаленное значение false в существующей записи или вы вставляете другую новую запись? Если вы вставляете новую запись, как вы определяете свой первичный ключ в таблице, так как теперь у вас есть 2 записи с одним и тем же ключом? Вы делаете deleted часть ключа? Дело в том, что вам приходится иметь дело со всеми этими типами нетривиальных проблем.

+0

Я работал над системами, использующими подход «мягкого удаления», подобный этому. Они хотели узнать, сколько из них было создано в общей сложности против того, что фактически использовалось в системе. Некоторые вещи были удалены на основе суеверия/последующих вещей, но они хотели иметь возможность восстановить при необходимости. Просто зависит от бизнес-правил, но это может повлиять на ресурсы/пространство на диске ... –

+0

@OMG Ponies - Я просто помню, что это был кошмар в проекте, над которым я работал. Я думаю, что лучшим подходом было бы использование триггера для копирования записей в другую таблицу, если вы хотите сохранить удаленные данные, но я бы избегал удаленных флагов, таких как чума :). Ваш пробег может отличаться. – dcp

+0

@dcp: Триггер для перемещения вещей требует дублирования таблицы - ни один из администраторов баз данных, о которых я знал в то время, не допустил бы такой вещи в своей модели данных. –

Смежные вопросы