Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Каскадные связи 
V
    Опции темы
Fire44
Дата 26.9.2010, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 17.9.2010

Репутация: нет
Всего: -1



Когда лучше делать каскадные связи между таблицами?
Например: Таблица№1 и Таблица№2, связь один ко многим.
При удалении всех записей из Таблицы №2, будут ли удалены записи из таблицы №1, если каскадные связи?
Одна запись таблицы №1 может иметь много значений из таблицы №2.
Я так понял, если удалить одну запись из таблицы №1, то все записи которые отвечают будут удалены из таблицы №2.

Это сообщение отредактировал(а) Fire44 - 26.9.2010, 17:34
PM MAIL   Вверх
Akina
Дата 26.9.2010, 20:31 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 13
Всего: 454



Цитата(Fire44 @  26.9.2010,  18:32 Найти цитируемый пост)
Когда лучше делать каскадные связи между таблицами?

Когда это соответствует логике.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Gluttton
Дата 26.9.2010, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 10
Всего: 54



Цитата(Fire44 @  26.9.2010,  17:32 Найти цитируемый пост)
Я так понял, если удалить одну запись из таблицы №1, то все записи которые отвечают будут удалены из таблицы №2.

Да.
Цитата(Fire44 @  26.9.2010,  17:32 Найти цитируемый пост)
Когда лучше делать каскадные связи между таблицами?

Цитата(Akina @  26.9.2010,  20:31 Найти цитируемый пост)
Когда это соответствует логике. 

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

Например: две таблицы - Сотрудник и Проект (один сотрудник на фирме может вести несколько проектов, но один проект ведется только одним сотрудником, т.е. связь один к одному ко многим). В одном случае при увольнении сотрудника информация о его проектах может не представлять интереса (и тогда можно реализовать каскадное удаление), а в другом случае информация о проектах уволенного сотрудника представляет интерес (и тогда не нужно реализовывать каскадное удаление)*. 

Еще одним (более удачным) примером может служить каскадное удаление в рекурсивных связях.
Например: есть таблица Отдел (один отдел может состоять из нескольких, но каждый из отделов входит в состав лишь одного отдела, т.е. связь один к одному ко многим, причем сущность ссылается сама на себя). И если предположим сократили некоторый отдел, то очевидно**, что сократили все отделы, которые ему подчиняются, т.е. приминение каскадного удаления оправдано.

А вообще, я думаю, что если нет стопроцентной уверенности в том, что необходимо реализовать каскадное удаление, то лучше от него воздержаться (это будет меньшим сюрпризом, для человека сопровождающего БД, чем его наличие).

---
* - стоит упомянуть о третьем (единственно верном случае), когда при увольнении сотрудника из БД не удаляется никакая информация, а просто сотрудник помечается как "уволеный".
** - очевидно мне в данном контексте, но в кажом конкретном случае это нужно уточнять


Добавлено @ 22:47
Цитата(Fire44 @  26.9.2010,  17:32 Найти цитируемый пост)
При удалении всех записей из Таблицы №2, будут ли удалены записи из таблицы №1, если каскадные связи?

Нет.

Это сообщение отредактировал(а) Gluttton - 27.9.2010, 00:34


--------------------
Слава Україні!
PM MAIL   Вверх
Fire44
Дата 27.9.2010, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 17.9.2010

Репутация: нет
Всего: -1



2Gluttton Спасибо!!
PM MAIL   Вверх
Akina
Дата 27.9.2010, 07:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 13
Всего: 454



Цитата(Gluttton @  26.9.2010,  23:40 Найти цитируемый пост)
В одном случае при увольнении сотрудника информация о его проектах может не представлять интереса (и тогда можно реализовать каскадное удаление), а в другом случае информация о проектах уволенного сотрудника представляет интерес (и тогда не нужно реализовывать каскадное удаление)*. 

Ты полагаешь, что это одна и та же логика???



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Gluttton
Дата 27.9.2010, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 10
Всего: 54



Цитата(Akina @  27.9.2010,  07:31 Найти цитируемый пост)
Ты полагаешь, что это одна и та же логика???

Конечно же нет! Я об этом и хотел написать:
Цитата(Gluttton @  26.9.2010,  22:40 Найти цитируемый пост)
При одной и тож же технической реалиазации, но при различных требованиях к БД

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


--------------------
Слава Україні!
PM MAIL   Вверх
Akina
Дата 27.9.2010, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 13
Всего: 454



То есть мы об одном и том же.
Я удовлетворён  smile 


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Zloxa
Дата 27.9.2010, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 11
Всего: 161



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

Это сообщение отредактировал(а) Zloxa - 27.9.2010, 14:51


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Gluttton
Дата 27.9.2010, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 10
Всего: 54



Цитата(Akina @  27.9.2010,  11:35 Найти цитируемый пост)
То есть мы об одном и том же.Я удовлетворён

Это не может не радовать smile !


Цитата(Zloxa @  27.9.2010,  14:49 Найти цитируемый пост)
А я каскадные ограничения

Цитата(Zloxa @  27.9.2010,  14:49 Найти цитируемый пост)
решению тяп-ляп

Я правильно провел аналогию?


--------------------
Слава Україні!
PM MAIL   Вверх
Zloxa
Дата 27.9.2010, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 11
Всего: 161



Цитата(Gluttton @  27.9.2010,  15:07 Найти цитируемый пост)
Я правильно провел аналогию? 

Это мое ИМХО.
Я уже писал ранее, мол я предпочитаю чтобы у меня процесс не отработал вовсе, если я что-то не учел, чем отработал не так, как я предполагал.

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

Это сообщение отредактировал(а) Zloxa - 27.9.2010, 15:14


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Gluttton
Дата 27.9.2010, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 10
Всего: 54



Цитата(Zloxa @  27.9.2010,  15:12 Найти цитируемый пост)
Это мое ИМХО.

Я вообще никогда о них и не задумывался (т.е. предпочитал NO ACTION), но однажды  Deniz обратил мое внимание, на возможность применения каскадного удаления при рекурсивных связях - это очень изящное и удачное решение!


--------------------
Слава Україні!
PM MAIL   Вверх
Akina
Дата 27.9.2010, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 13
Всего: 454



Цитата(Gluttton @  27.9.2010,  16:49 Найти цитируемый пост)
это очень изящное и удачное решение! 

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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Zloxa
Дата 27.9.2010, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 11
Всего: 161



Gluttton, ну а теперь представь себе что такого рода систему ты спроектировал не сам, а просто забрал на саппорт и  тебе выставили сервисколл "удалить запись c id = 10 - ПОДГУЗНИКИ ВСЯКИЕ" Срок - "вчера". Станешь ли ты анализировать все рефсы на этот ид на предмет каскадности? А базу то ведь можешь выкосить чуть ли не полностью. И доказывай потом заказчику что записи с id = 11,12,13 и все связанные с ними данными, согласно логике приложения, дожны быть выкошены вместе с записью id = 10. Но он ведь, с-ка совсем не то имел в виду.

Это сообщение отредактировал(а) Zloxa - 27.9.2010, 16:08


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Gluttton
Дата 27.9.2010, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 10
Всего: 54



Цитата(Akina @  27.9.2010,  15:55 Найти цитируемый пост)
Я лично считаю его ужасным

???
В контексте поставленной задачи?
В двух словах: там решалась задача описания иерархической структуры с разнородными (два вида элементами). В качестве примера мною была выбрана модель файловой системы (описание файлов и директорий). Так вот, для решения задачи удаления папки (я думаю, что в данном контексте необходимость удаления всех ее подпапок и файлов очевидна) мною было предложено следующее решение:
Код

    DELETE FROM F
    WHERE F.DIRECTORY IN
    (
        SELECT H.ID
        FROM
        (
            WITH RECURSIVE
            SUB AS
            (
                SELECT D.ID, D.ENTRY
                FROM D
                    WHERE D.NAME=:FOLDER
                UNION ALL
                SELECT D.ID, D.ENTRY
                FROM SUB, D
                    WHERE D.ENTRY=SUB.ID
            )
            SELECT DISTINCT
                SUB.ID,
                SUB.ENTRY
           FROM D, SUB
        )   AS H
    );
    DELETE FROM D
    WHERE D.NAME=:FOLDER
    OR D.ENTRY IN
    (
        SELECT H.ID
        FROM
        (
            WITH RECURSIVE
            SUB AS
            (
                SELECT D.ID, D.ENTRY
                FROM D
                    WHERE D.NAME=:FOLDER
                UNION ALL
                SELECT D.ID, D.ENTRY
                FROM SUB, D
                    WHERE D.ENTRY=SUB.ID
            )
            SELECT DISTINCT
                SUB.ID,
                SUB.ENTRY
            FROM D, SUB
        )   AS H
    );

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

    DELETE FROM D
    WHERE D.NAME=:FOLDER;


Цитата(Zloxa @  27.9.2010,  16:04 Найти цитируемый пост)
Gluttton, ну а теперь представь

Согласен. Я об этом упомянул:

Цитата(Gluttton @  26.9.2010,  22:40 Найти цитируемый пост)
А вообще, я думаю, что если нет стопроцентной уверенности в том, что необходимо реализовать каскадное удаление, то лучше от него воздержаться (это будет меньшим сюрпризом, для человека сопровождающего БД, чем его наличие).



Akina, Zloxa, однозначно у вас большее опыта и я в этой теме прислушаюсь к вашему мнению вопреки своим теоретическим домыслам, но все же мне кажеться, что вы очень категоричны и существуют случаи, когда каскадное удаление оправдано! Если вас не устраивает пример на рекурсивных связях, то, на мой взгляд, еще одним претендентом может быть каскадное удаление из вспомогательной таблицы при обеспечении связи М:М - нафига там это хлам оставлять? О чем он скажет поле удаления master-записи?


--------------------
Слава Україні!
PM MAIL   Вверх
Akina
Дата 27.9.2010, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 13
Всего: 454



Цитата(Gluttton @  27.9.2010,  17:16 Найти цитируемый пост)
существуют случаи, когда каскадное удаление оправдано

Да, когда ценность хранящейся в БД информации равна нулю.

Добавлено через 2 минуты и 8 секунд
Цитата(Gluttton @  27.9.2010,  17:16 Найти цитируемый пост)
 В качестве примера мною была выбрана модель файловой системы (описание файлов и директорий). Так вот, для решения задачи удаления папки (я думаю, что в данном контексте необходимость удаления всех ее подпапок и файлов очевидна) мною было предложено следующее решение:

Корзину (и рековерилки для тех, кто удалял мимо или успел почистить) не от хорошей жизни придумали...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Общие вопросы по базам данных"
LSD
Zloxa

Данный форум предназначен для обсуждения вопросов о базах данных не попадающих под тематику других форумов:

  • вопросам по СУБД для которых нет отдельных подфорумов
  • вопросам которые затрагивают несколько разных СУБД (например проблема выбора)
  • инструменты для работы с СУБД
  • вопросы проектирования БД
  • теоретически вопросы о СУБД

Данный форум не предназначен для:

  • вопросов о поиске разлиных БД (если не понимаете чем БД отличается от СУБД то: а) вам не сюда; б) Google в помощь)
  • обсуждения проблем с доступом к СУБД из различных ЯП (для этого есть соответсвующие форумы по каждому ЯП)
  • обсуждения проблем с написание SQL запросов, для этого есть форум Составление SQL-запросов
  • просьб о написании курсовой, реферата и т.п., для этого есть Центр помощи или фриланс биржа
  • объявлений о найме специалистов, для этого есть раздел Объявления о найме специалистов

Если вы не соблюдаете эти правила, не удивляйтесь потом не найдя свою тему/сообщение. ;)


Полезные советы:

При написании сообщения постарайтесь дать теме максимально понятное название. В теме максимально подробно опишите проблему. Если применимо укажите: название базы данных и версии (MySQL 4.1, MS SQL Server 2000 и т.п.); используемых язык программирования; способа доступа (ADO, BDE и т.д.); сообщения об ошибках.

Для вставки кода используйте теги [code=sql] [/code].

Литературу по базам данных можно поискать здесь.

Действия модераторов можно обсудить здесь.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, LSD, Zloxa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | СУБД, общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0787 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.