Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Двухсторонний Cascade Delete в One-To-One / 10 сообщений из 10, страница 1 из 1
25.05.2014, 12:37:48
    #38651308
Xcopy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двухсторонний Cascade Delete в One-To-One
Ребят, всем привет!

Попробую перейти сразу к делу:
Есть 2 таблицы:

Messageidtextphoto_id

Photoidfile_name

От Message к Photo (через photo_id) идет связь один к одному. На эту связь я сделал каскадное удаление.
Теперь, при удалении записи в Photo удалется соответствующая запись в Message.

А как сделать без триггеров так, чтобы какскадное удаление работало в обе стороны? Например, чтобы я удалял запись в таблице Message и соответствующая ей фотография в Photo удалялась тоже.

Заранее спасибо!!!
...
Рейтинг: 0 / 0
25.05.2014, 12:53:31
    #38651310
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двухсторонний Cascade Delete в One-To-One
XcopyОт Message к Photo (через photo_id) идет связь один к одному. На эту связь я сделал каскадное удаление.
Теперь, при удалении записи в Photo удалется соответствующая запись в Message.Это связь много-к-одному. Разверните ее направление и получите "чтобы я удалял запись в таблице Message и соответствующая ей фотография в Photo удалялась тоже."
...
Рейтинг: 0 / 0
25.05.2014, 13:18:14
    #38651316
Xcopy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двухсторонний Cascade Delete в One-To-One
miksoft, большое спасибо за ответ!

Я бы так и сделал, но:
дело в том, что в таблице Photo хранятся не только фотографии для Message'в, но и для таблицы Users (аватарки) которую я сюда не привел...

Каждая фотография может соответствовать только одному Message или User, и к Message может быть прикреплена только 1 фотография т.к. (проект такой :) )

Можно применить ваш вариант, но тогда придется создать 2 таблицы:
Photo - для Message и Avatar для User.
...
Рейтинг: 0 / 0
25.05.2014, 14:57:01
    #38651351
Xcopy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двухсторонний Cascade Delete в One-To-One
Прикрепил визуализацию модели:

:)
...
Рейтинг: 0 / 0
25.05.2014, 15:13:03
    #38651357
Xcopy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двухсторонний Cascade Delete в One-To-One
Можно сделать вот-так, но это выглядит как-то кривовато...
...
Рейтинг: 0 / 0
25.05.2014, 22:55:03
    #38651540
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двухсторонний Cascade Delete в One-To-One
XcopyМожно применить ваш вариант, но тогда придется создать 2 таблицы:
Photo - для Message и Avatar для User.я бы так и сделал.

Либо, хотя это будет костылем, можете оставить изначальную связь, но удаление производите через удаление записи в таблице Photo.
...
Рейтинг: 0 / 0
25.05.2014, 23:24:45
    #38651555
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двухсторонний Cascade Delete в One-To-One
Xcopyкак сделать без триггеров так, чтобы какскадное удаление работало в обе стороны? Например, чтобы я удалял запись в таблице Message и соответствующая ей фотография в Photo удалялась тоже.Не понимаю смысл двустороннего каскадного удаления.

Смысл каскада (как я его понимаю) в том, что есть главная таблица, и есть подчиненные. И при удалении записи из главной таблицы каскадно удаляются записи во всех подчиненных таблицах.

Попытка назначить одной сущности более одной главной таблицы... Не понимаю смысла этого действа, кроме как запутать себя, сервер, и всех тех кто будет потом пытаться разобраться в коде.
...
Рейтинг: 0 / 0
26.05.2014, 11:39:01
    #38651813
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двухсторонний Cascade Delete в One-To-One
Cygapb-007Xcopyкак сделать без триггеров так, чтобы какскадное удаление работало в обе стороны? Например, чтобы я удалял запись в таблице Message и соответствующая ей фотография в Photo удалялась тоже.Не понимаю смысл двустороннего каскадного удаления.

Смысл каскада (как я его понимаю) в том, что есть главная таблица, и есть подчиненные. И при удалении записи из главной таблицы каскадно удаляются записи во всех подчиненных таблицах.

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

я больше скажу. каскадные действия применимы к ограничениям накладываемые логикой базы.

я не уверен за все версии мускла, но
у меня каскад на полную используеться

1)таблиа с сылкой на себя - дерево. главнаые узлы(корни) дерева, ссылаються на самих себя(айди записи = внешнему ключу)
при удалении узла, вся ветка каскадно удаляеться, при удалении корня, тоже всё нормально

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

так вот, сдесь каскадные действия не работают в обе стороны.
тоесть мускл сдесь цикл не обнаруживает
удаляет юзера(ставит лок на строку) смотрит что надо бы и корень удалить, удаляет корень(ставит лок на строку), и тут оказываеться надо юзера удалить - пытаеться и видит что лок стоит, что нельзя. и выдаёт ошибку.

А логики вообще в подобных действительно нету. ибо по логике каскадное действие это не упростить работу, для этого есть хранимки тригеры
каскадное действие для поддержки целосности базы, чтобы гарантировать что одного без другого быть не может, поэтому при удалении другого, одно надо тутже удалять - и это всё одним заходом.

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

ЗЫ
а тригера бояться не надо. у меня на дерево, юзеров и ещо одну подчинёную таблицу навешано по три тригера на каждую(на одну четыре), плюс две промеждуточные таблицы, одна с тригером, плюс три ивента с периодичностью старта 5сек.
и это всё для обеспечения нужной мне логики.
...
Рейтинг: 0 / 0
26.05.2014, 14:06:50
    #38652060
Xcopy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двухсторонний Cascade Delete в One-To-One
Ребят, всем большое спасибо за отзывы!!!

Я немного пораскинул головой и решил просто убрать Photo и воткнуть поля avatar в User и photo в Message т.к. все равно к каждому сообщению может быть прикреплена только 1 фотография, с аватаркой то же самое.

Вроде и без костылей, и работает...

Так что получилось, что-то вроде:
...
Рейтинг: 0 / 0
26.05.2014, 14:09:21
    #38652067
Xcopy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двухсторонний Cascade Delete в One-To-One
Хотя, модель, конечно получилась плохо маштабируемой...
такое ощущение)
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Двухсторонний Cascade Delete в One-To-One / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]