Я работаю в социальной сети, вроде Facebook. Я думаю, это означает, что приложение будет более загруженным для чтения, чем для записи (т.е. больше SELECTS, чем INSERTS, UPDATES или DELETES)
Я планирую использовать MySQL для базы данных, используя MyISAM. Каждая таблица в базе данных будет содержать следующие три поля:
CREATED
- поле даты, содержащее время создания записиUPDATED
- поле даты, содержащее время изменения записиROWSTATUS
- поле CHAR (1), содержащее односимвольный флаг, показывающий, является ли запись активной, неактивной или удаленной (с использованием значений «A»,I
иD
соответственно).
С помощью класса-оболочки PHP мы гарантируем, что все запросы SELECT включают ROWSTATUS, запросы UPDATE также обновляют столбец UPDATED, а запросы INSERT обновляют столбец CREATED.
Я не планирую фактически удалять какие-либо записи, вместо этого я предпочитаю обновить это поле ROWSTATUS записей до D
, чтобы показать, что оно удалено (т.е. мягкое удаление).
У нас есть процедура SQL, которая физически удаляет удаленные данные через 10 дней.
Однако я просматривал эту статью, в которой утверждается что нет необходимости удалять физически из-за накладных расходов на блокировку. Скорее автор предложил использовать такую схему:
SELECT e.eventid,e.title
FROM events e
WHERE NOT EXISTS
(SELECT * FROM event_deletes ed WHERE ed.eventid = e.eventid);
Мне интересно, как моя схема соотносится с этим предложенным механизмом, и какой из них лучше? Я не мог прийти к какому-либо однозначному ответу самостоятельно.