|
|
|
Удаление записей с возможностью восстановления
|
|||
|---|---|---|---|
|
#18+
Добрый день! В целом вопрос относится именно к проектированию, добавлю только то, что реальная база на которой планируется всё это сделать - PostgreSQL. ---------------------------------- Задача: ---------------------------------- Предположим у нас есть некая таблица objects и есть некая таблица users . У objects есть внешний ключ на users : user_id . Необходимо реализовать функционал "Удаление объектов с возможностью восстановления". Например, зашел клиент на сайт, жмет кнопку "Удалить", а вместо нее появляется кнопка "Восстановить". Но, когда он перешел уже на другую страницу, то этой записи уже нет в списке объектов. Но, зато у пользователя есть страница "История", в которой он видит все удаленные им объекты и так же имеет возможность их восстановить. ---------------------------------- Предварительное решение: ---------------------------------- Создать поле status в таблице objects и если он deleted, то значит запись удалена. Восстановление записи равносильно выставлению флажка status = regular. Мне кажется есть более лучшие решения таких задач. Хотелось бы получить советы от уважаемых форумчан. ----- Еще один гипотетический недостаток моего решения, на мой взгяд, в том, что если "удаленных" записей (status = deleted) будет слишком много , то они начнут мешать поиску по нормальным записям (из-за того что таблица будет большой ). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2014, 06:22 |
|
||
|
Удаление записей с возможностью восстановления
|
|||
|---|---|---|---|
|
#18+
Ну вариант "в лоб" с ведением таблицы истории недавно обсуждалось Путешествия в прошлое насколько оно более лучше решайте сами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2014, 08:52 |
|
||
|
Удаление записей с возможностью восстановления
|
|||
|---|---|---|---|
|
#18+
scymaks, нет, более лучшего решения нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2014, 08:55 |
|
||
|
Удаление записей с возможностью восстановления
|
|||
|---|---|---|---|
|
#18+
MasterZiv, понятно. А как Вы считаете, стоит делать индекс на поле status? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2014, 09:21 |
|
||
|
Удаление записей с возможностью восстановления
|
|||
|---|---|---|---|
|
#18+
scymaksЕще один гипотетический недостаток моего решения, на мой взгяд, в том, что если "удаленных" записей (status = deleted) будет слишком много , то они начнут мешать поиску по нормальным записям (из-за того что таблица будет большой ). Не начнут, если у тебя будут хорошие критерии поиска. Если критерии будут плохие, то даже без удалённых объектов ты будешь иметь проблемы. И ты всегда можешь включить признак удаления в любой индекс, по которому ведётся поиск, и использовать его как доп. критерий поиска. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2014, 09:59 |
|
||
|
Удаление записей с возможностью восстановления
|
|||
|---|---|---|---|
|
#18+
scymaksMasterZiv, понятно. А как Вы считаете, стоит делать индекс на поле status? Отдельно -- нет. А в совокупности с другими полями -- да. Отдельно можно делать только если в СУБД есть технология пересечения разных индексов как Microsoft rush-more. Но это бывает редко. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2014, 10:00 |
|
||
|
Удаление записей с возможностью восстановления
|
|||
|---|---|---|---|
|
#18+
scymaks, У вас сейчас есть 2 справочника ... Можно создать еще таблицу objects_users_link (уникальный индекс по полям object_id и user_id), в этой таблице добавить поле status и создать таблицу objects_users_link_history (уникальный индекс по дате изменения \ добавления записи и objects_users_link_id ), в которой добавить тоже поле status Нарисовать витрину, где таблица objects_users_link соединяется с objects_users_link_history по ключу objects_users_link_id и status из таблицы objects_users_link_history равен 1 (т.е. не удален). [ в таблице objects_users_link_history только для одной записи objects_users_link_id может быть статус 1] Так вы сможете выводить всю историю изменений и менять для конкретной записи objects_users_link_id за нужную дату статус. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2014, 11:21 |
|
||
|
Удаление записей с возможностью восстановления
|
|||
|---|---|---|---|
|
#18+
MasterZivscymaksЕще один гипотетический недостаток моего решения, на мой взгяд, в том, что если "удаленных" записей (status = deleted) будет слишком много , то они начнут мешать поиску по нормальным записям (из-за того что таблица будет большой ). Не начнут, если у тебя будут хорошие критерии поиска. Если критерии будут плохие, то даже без удалённых объектов ты будешь иметь проблемы. И ты всегда можешь включить признак удаления в любой индекс, по которому ведётся поиск, и использовать его как доп. критерий поиска. Пока что ожидается два типа запросов: достать объект(ы) по идентификатору / достать объекты по user_id ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2014, 12:49 |
|
||
|
Удаление записей с возможностью восстановления
|
|||
|---|---|---|---|
|
#18+
scymaksMasterZivпропущено... Не начнут, если у тебя будут хорошие критерии поиска. Если критерии будут плохие, то даже без удалённых объектов ты будешь иметь проблемы. И ты всегда можешь включить признак удаления в любой индекс, по которому ведётся поиск, и использовать его как доп. критерий поиска. Пока что ожидается два типа запросов: достать объект(ы) по идентификатору / достать объекты по user_id Ничего сложного не наблюдается. Первое вообще по PK. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2014, 13:32 |
|
||
|
Удаление записей с возможностью восстановления
|
|||
|---|---|---|---|
|
#18+
MasterZiv, Ну так теперь же всегда будет статус учавствовать. Код: sql 1. 2. 3. 4. 5. Вопрос, кстати, еще один интересует. Стоит ли делать индексы на внешний ключ с условиями where? Ну например, есть такие данные: objects: Код: sql 1. 2. 3. 4. 5. 6. Стоит ли создавать индексы Код: sql 1. 2. 3. ... ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2014, 15:42 |
|
||
|
Удаление записей с возможностью восстановления
|
|||
|---|---|---|---|
|
#18+
scymaksMasterZiv, Ну так теперь же всегда будет статус учавствовать. Код: sql 1. 2. 3. 4. 5. Ну и добавь его в индексы на user_id (user_id, status). В индекс по ID добавлять status бессмысленно, и проверять его бессмысленно -- только если ты не хочешь показать удалённый объект. Если и хочешь, это без доп. затрат и так проверится, без добавления status в индекс по ID. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2014, 15:47 |
|
||
|
Удаление записей с возможностью восстановления
|
|||
|---|---|---|---|
|
#18+
scymaksСтоит ли делать индексы на внешний ключ с условиями where? Ну например, есть такие данные: objects: Код: sql 1. 2. 3. 4. 5. 6. Стоит ли создавать индексы Код: sql 1. 2. 3. ... ? Зависит от того, какие запросы. Такие Индексы с WHERE по любому очень странны, и уж на всех пользователей их точно не нужно создавать. Либо на всех без where , либо на какого-то одного-двух юзеров. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2014, 15:50 |
|
||
|
Удаление записей с возможностью восстановления
|
|||
|---|---|---|---|
|
#18+
MasterZivscymaksСтоит ли делать индексы на внешний ключ с условиями where? Ну например, есть такие данные: objects: Код: sql 1. 2. 3. 4. 5. 6. Стоит ли создавать индексы Код: sql 1. 2. 3. ... ? Зависит от того, какие запросы. Такие Индексы с WHERE по любому очень странны, и уж на всех пользователей их точно не нужно создавать. Либо на всех без where , либо на какого-то одного-двух юзеров. Удаление без where, это то, что должен усвоить каждый креативный разработчек:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2014, 16:01 |
|
||
|
Удаление записей с возможностью восстановления
|
|||
|---|---|---|---|
|
#18+
scymaks Еще один гипотетический недостаток моего решения, на мой взгяд, в том, что если "удаленных" записей (status = deleted) будет слишком много, то они начнут мешать поиску по нормальным записям (из-за того что таблица будет большой)Люди не для того вводят данные чтобы их удалять. Иными словами очень вряд ли такое случится. В любом случае (будя такое случится), можно добавить в регламент очистку старых удаленных данных с утаптыванием таблицы на физическом уровне. У вашего статуса больше двух значений (regular, deleted)? Если только два то рекомендую обозвать поле типа is_deleted чтобы было меньше путаницы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2014, 17:59 |
|
||
|
Удаление записей с возможностью восстановления
|
|||
|---|---|---|---|
|
#18+
scymaksВ целом вопрос относится именно к проектированию, добавлю только то, что реальная база на которой планируется всё это сделать - PostgreSQL В том, что Вы написали, на логическом уровне Вы задействуете две сущности: ДЕЙСТВУЮЩИЕ_ОБЪЕКТЫ и УДАЛЁННЫЕ_ОБЪЕКТЫ. Вам нужно выбрать удобную реализацию на физическом уровне. Использование для этого статуса или флага - наиболее частое решение, в основном в силу простоты и универсальности. Таким образом любую таблицу можно в одночасье сделать "поддерживающей восстановление" итп. О количестве удалённых записей обычно беспокоиться незачем, поскольку их мало - в нормальном бизнес-процессе их активно не удаляют. Основная проблема подхода - везде, где используются данные объектов, может "по рассеянности" проскочить удалённый, не забыть везде поставить условие - задача кропотливая и сомнительная. Её можно значительно облегчить, если спрятать таблицу за парой вьюх, но всё равно остаётся много моментов, о которых приходится помнить. Основная альтернатива такому решению - использование отдельных таблиц для действующий и удалённых объектов. Это в общем вызывает двойной геморрой при сопровождении, а также усложняет операции удаления и восстановления, но обеспечивает более сильные гарантии в бизнес-логике - например, уже будет не так легко удалить объект, на который есть действующие ссылки. Зато если данные сильно связаны ссылками, такая схема становится подлинным кошмаром. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2014, 18:34 |
|
||
|
|

start [/forum/search_topic.php?author=alingo&author_mode=last_posts&do_search=1]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
32ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
2ms |
| others: | 438ms |
| total: | 611ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...