Удаление данных в отношении «многие ко многим» или статус = неактивен - PullRequest
0 голосов
/ 10 ноября 2010

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

Тальб

CREATE TABLE `comments`(
id INT NOT NULL,
comment TEXT,
status enum('active','inactive','deleted'), //Should this be added?
PRIMARY KEY(id)
);

CREATE TABLE `files`(
id INT NOT NULL
file_path VARCHAR(100),
status enum('active','inactive','deleted'), //Should this be added?
PRIMARY KEY (id)
);
CREATE TABLE `comments_files_xref`(
comment_id INT NOT NULL,
file_id INT NOT NULL,
PRIMARY KEY (comment_id,file_id)
);

Должен ли я установить столбец состояния как неактивный и указать WHERE table.status = 'active' в моих операторах выбора? Должен ли я просто удалить строки? Что лучше для производительности? Я всегда мог запустить cron для «очистки» status = «удаленных» строк.

Ответы [ 3 ]

1 голос
/ 10 ноября 2010

Это зависит от нескольких вещей.Ваш вопрос не совсем понятен.Основываясь на ваших комментариях, где вы разместили индикатор IsDeleted, я буду предполагать, что если либо Комментарий, либо Файл будет удален, то вы также захотите удалить CommentFile, звучит странно, но я пойду с этим.

  1. Если число строк в CommentFile мало, для каждой отдельной строки в комментарии или файле просто удалите их.

  2. Если оно большое, то оно обязательноэто соображение, и IsDeleted это хорошая идея.Тогда да, вам нужно задание cron, которое запускается в фоновом режиме, с более низким приоритетом и удаляет WHERE IsDeleted = 1, в пакетах по 1000.

  3. Но при изменении каждого Select включить WHERE IsDeleted =0, не собирается работать.Это будет сканирование таблицы.Чтобы преодолеть это (заставить Select в (2) работать как запланировано), вам нужно добавить индекс, который замедляет вставки и удаляет еще больше.Так что я бы вообще забыл (3) и пошел только с (2);если у вас много удалений, запустите два задания cron, одно по возрастанию и одно по убыванию.

  4. Еще лучше, пусть задания по очистке выполняются в бесконечном цикле, запускаемом cron один раз в день.Вы можете запустить более двух одновременно: разделите таблицу по диапазону PK на no_of_jobs.Контролируйте задания и настоящие онлайн-задачи, настраивайте их, вставляя небольшую задержку (например, 1 или 5 секунд) в цикл.Это то, что мы делаем в крупных банковских системах OLTP.

0 голосов
/ 11 ноября 2010

Почему бы просто не выгрузить строки, которые вы планируете удалить, в архивные таблицы в той же базе данных или другой базе данных хранилища, а затем физически удалить строки из вашей производственной базы данных?

0 голосов
/ 10 ноября 2010

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

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

...