Удаление строк из таблицы

mak_sim2001

Новичок
Удаление строк из таблицы

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

Допустим, есть Событие, которое хранится в таблице “events” есть связанные с этой таблицей другие таблицы “events_statistic”, “event_types” и т.д. есть даже изображение к этому событию хранится в файловой системе. Есть метод удаления события.

Как будет грамотнее сделать удаление множества событий?
А именно, удалять их по одному используя существующий метод либо писать специальный метод?


Интересует с точки зрения проектирования бо у меня пока получается что-то типа того:
PHP:
foreach($id_array as $id) {
    $event = new Event($id);
    $event->deleteEvent();
}
думаю это не есть good...
Необходимо для админки, и для удаления просроченных событий по cron
 

gray07

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

WP

^_^
Жесть. Более извращеннй способ удаления трудно придумать.
 

korchasa

LIMB infected
Re: Удаление строк из таблицы

Автор оригинала: mak_sim2001
Как будет грамотнее сделать удаление множества событий?
А именно, удалять их по одному используя существующий метод либо писать специальный метод?
...
А что не нравится? Что много запросов?
Например, статическую функцию Event::deleteByIds($array). Хотя скорее всего заворачиваться не стоит, т.к. скорее всего это не частая операция. А вообще какой смысл удалять несколько событий одновременно(возможно тут косячек)?

WP
Расскажешь как правильно это делать?
 

Beavis

Banned
mak_sim2001
mysql_query("DELETE FROM `events` WHERE `event_date` < NOW()");

чем не устраивает?
 

berkut

Новичок
Beavis
Событие, которое хранится в таблице “events” есть связанные с этой таблицей другие таблицы “events_statistic”, “event_types” и т.д. есть даже изображение к этому событию хранится в файловой системе. Е
 

HraKK

Мудак
Команда форума
У меня в описании модели можно сказать
AddEvent('DELETE','SomeFunctionOnDelete');
То есть будет выглядеть так.
$event->delete($id) //('DELETE FROM.... WHERE ID=$id')
что вызовет
SomeFunctionOnDelete($id);
Которая в свою очередь удалит
и остальные связующие звенья
 

korchasa

LIMB infected
Автор оригинала: HraKK
У меня в описании модели можно сказать
AddEvent('DELETE','SomeFunctionOnDelete');
То есть будет выглядеть так.
$event->delete($id) //('DELETE FROM.... WHERE ID=$id')
что вызовет
SomeFunctionOnDelete($id);
Которая в свою очередь удалит
и остальные связующие звенья
Хм, а зачем отвязывать обработчик от самой модели? ИМХО, логичнее у самой модели, до удаления вызывать $this->beforeDelete(), а после - $this->afterDelete(), если они определены.
 

HraKK

Мудак
Команда форума
Потому что удаление может происходить из разных методов=)
 

FractalizeR

Новичок
Если задача стоит так: обеспечить максимальное быстродействие при удалении как большого количества объектов, так и одного объекта, при этом сохранив логику удаления в одном месте, я думаю, так бы попробовал:

PHP:
<?php

class Event {
	
	/**
	 * Id события
	 *
	 * @var unknown_type
	 */
	protected $_id;

	/**
	 * Массив id событий, которые нужно удалить
	 *
	 * @var array
	 */
	protected static $_deleteQueue = array ( );

	/**
	 * Ставит событие с указанным id в очередь на удаление
	 *
	 * @param integer $id
	 */
	public static function queueDeleteOperation($id) {
		$this->_deleteQueue [] = $id;
	}

	/**
	 * Удаляет из базы данных события, поставленные в очередь на удаление
	 *
	 */
	public static function processDeleteQueue() {
		global $db;
		
		if (count($this->_deleteQueue) < 1) {
			throw Exception('Deleting queue is empty!');
		}
		
		$eventIdsToDelete = implode(',', $this->_deleteQueue);
		
		$db->startTransaction;
		
		$sql = 'DELETE FROM events_statistic WHERE eventid IN(' . $eventIdsToDelete . ')';
		$db->execute($sql);
		
		$sql = 'DELETE FROM event_types WHERE eventid IN(' . $eventIdsToDelete . ')';
		$db->execute($sql);
		
		$sql = 'DELETE FROM events WHERE eventid IN(' . $eventIdsToDelete . ')';
		$db->execute($sql);
		
		//тут удаление файлов
		
		$db->commit();
		$this->_deleteQueue = array();
	}

	/**
	 * Удаляет это событие из базы
	 *
	 * @param integer $id
	 */
	public function delete() {
		Event::queueDeleteOperation($this->_id);
		Event:: processDeleteQueue();
	}
}
?>
Код схематичный (только что набросал). Я отталкивался от того, что для удаления события и его зависимых элементов достаточно знать его id.

EXPLAIN показывает, что WHERE id IN(value) и WHERE id=value имеют одинаковое быстродействие.
 

WP

^_^
korchasa
Охотно. Если у нас есть массив ID и его надо удалить, то просто $orm->deleteNews($ids);
Если есть УЖЕ созданные объекты ряды которых надо удалить:
...
PHP:
static $delete_queue = array();
function delete () {self::$delete_queue[] = $this->id;}
function flush()
{
 //....
 self::$delete_queue = array();}
........................................

$obj->delete();
$obj2->delete();
$obj3->delete();
$obj->flush();
 
Сверху