powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Связь по трем таблицам
20 сообщений из 20, страница 1 из 1
Связь по трем таблицам
    #38575029
SolidSnake
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

Есть ли способ, ключами ораганизовать следующие ограничения:
В таблице "Dictionary", должно быть возможно внести GUID, который содержится хотя бы в одной из таблиц Table.
При этом, "table 1" и "table 2" всегда содержат не совпадающие GUID.

Как мне представляется, можно выключить ограничения внешнего ключа (или удалить его полность),
Добавить "Проверочные ограничения" в таблицу "Dictionary", а в table1 и 2 триггеры на удаление.

Или есть другой способ?
...
Рейтинг: 0 / 0
Связь по трем таблицам
    #38575310
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolidSnakeИли есть другой способ?
Конечно есть: слить table1 и table2 в одну table, тогда foreign key это всё что нужно.

PS: Триггерами эту задачу не решить в принципе.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Связь по трем таблицам
    #38575339
Фотография lLocust
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, SolidSnake,

Можно не полностью таблицы сливать, а вынести GUID + общие поля. И да FK в помощь......
...
Рейтинг: 0 / 0
Связь по трем таблицам
    #38575505
SolidSnake
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторКонечно есть: слить table1 и table2 в одну table, тогда foreign key это всё что нужно.
Это конечно не вариант. Я привел простые таблицы.
А что если таблица1 - "Роли", таблица2 - "Пользователи"? сливать это в отду таблицу - значит сделать себе море проблем в запросах.

авторPS: Триггерами эту задачу не решить в принципе.
Функцилнальность "Проверочные ограничения" позволит запретить запись строк, проверяя наличие строки хотябы в одной таблице.
А триггеры на таблицу 1 и 2 нужны для того, чтобы обрабатывать удаление строк, удаляя чтобы при удалении они также были удалены из таблицы Dictionary.

авторМожно не полностью таблицы сливать, а вынести GUID + общие поля.
Я объясню чуть больше, зачем я спрашиваю :)
Представьте себе класс "TClass" и его наследника "TClassExt".
В нашем случае - объект класса "TClass" будет записан в таблицу 1.
Объект класса наследника "TClassExt" должен представлять собой другую таблицу, с теме же колонками + N количество новых (таблица 2).

Есть еще другой объект, который хранится в таблице dictionary, одно из полей которого, ссылка объект "TClass" или ссылка на объект наследника "TClassExt".

Слив таблиц не подходит еще потому, что имена колонок в "TClassExt" должны совпадать с "TClass".
...
Рейтинг: 0 / 0
Связь по трем таблицам
    #38575511
SolidSnake
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторПредставьте себе класс "TClass" и его наследника "TClassExt".
В нашем случае - объект класса "TClass" будет записан в таблицу 1.
Объект класса наследника "TClassExt" должен представлять собой другую таблицу, с теме же колонками + N количество новых (таблица 2).
На картинке имена колонок таблица 1 и 2 не совпадают, но на самом деле должны совпадать)
Еще в таблице 2 можно вообразить пару других колонок. Но сути вопроса про связи это не меняет.
...
Рейтинг: 0 / 0
Связь по трем таблицам
    #38575544
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolidSnakeФункцилнальность "Проверочные ограничения" позволит запретить запись
строк, проверяя наличие строки хотябы в одной таблице.
А триггеры на таблицу 1 и 2 нужны для того, чтобы обрабатывать удаление строк, удаляя
чтобы при удалении они также были удалены из таблицы Dictionary.

Пофиг. Ссылочная целостность на триггерах в современных РСУБД в многопользовательском
режиме не работает. Точка.

SolidSnakeСлив таблиц не подходит еще потому, что имена колонок в "TClassExt"
должны совпадать с "TClass".
Наоборот: это ещё один довод чтобы их слить вместе.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Связь по трем таблицам
    #38575567
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ищите по форуму по слову "Наследование". Обсуждалось многократно.
В двух словах: ответ в первом же посте у Dimitry Sibiryakov
...
Рейтинг: 0 / 0
Связь по трем таблицам
    #38575885
Sergei.Agalakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забудьте вы про триггера.
Кроме того, что уже сказали, есть вариант двух FK к разным родителям из таблицы-потомка, и чек-констрайнта, проверяющего,, что только одно поле FK для записи потомка заполненно, а второе NULL.
...
Рейтинг: 0 / 0
Связь по трем таблицам
    #38576001
SolidSnake
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А как такой вариант:
Создаем таблицу ссылок, состоящую из GUID и Варчара с именем таблицы откуда guid был заполнен.
К этой таблице цепляем таблицу 1 и 2. При добавлении записи в таблицу 1 или 2, guid будет дублироваться в таблице ссылок.
Из Dictionary можно ссылаться на таблицу ссылок вместо исходных таблиц.
...
Рейтинг: 0 / 0
Связь по трем таблицам
    #38576004
SolidSnake
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторК этой таблице цепляем таблицу 1 и 2.
PK будет в таблице ссылок.
...
Рейтинг: 0 / 0
Связь по трем таблицам
    #38576007
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolidSnakeА как такой вариант:
Избыточный. Не мелочись и перенеси в "таблицу ссылок" атрибуты (поля), общие у таблиц 1 и
2. Мой телепатер утверждает, что одна из таблиц при этом полностью опустеет и может быть
удалена. О чём тебе и твердят весь топик.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Связь по трем таблицам
    #38576435
Бредятина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolidSnakeДобрый день!

Есть ли способ, ключами организовать следующие ограничения:
В таблице "Dictionary", должно быть возможно внести GUID, который содержится хотя бы в одной из таблиц Table.
При этом, "table 1" и "table 2" всегда содержат не совпадающие GUID.

Как мне представляется, можно выключить ограничения внешнего ключа (или удалить его полностью),
Добавить "Проверочные ограничения" в таблицу "Dictionary", а в table1 и 2 триггеры на удаление.

Или есть другой способ?
Как это делается в системах управления базами данных (СУБД), в отличие от используемой Вами системы хранения и обработки данных (СХОД).
Есть объекты A, B, C, D, ... (в Вашем примере две таблицы - table1 и table 2 - очевидно, что их может быть сколько угодно, и они могут представлять различные типы сущностей, которые нельзя "сливать").
Создаем объект Ob и объявляем связи 1:М этого объекта с каждым из объектов A, B, C, D...
...
Рейтинг: 0 / 0
Связь по трем таблицам
    #38576704
Бредятина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
БредятинаСоздаем объект Ob и объявляем связи 1:М этого объекта с каждым из объектов A, B, C, D...
Извиняюсь, 1:1, конечно)
...
Рейтинг: 0 / 0
Связь по трем таблицам
    #38576957
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lLocustDimitry Sibiryakov, SolidSnake,

Можно не полностью таблицы сливать, а вынести GUID + общие поля. И да FK в помощь......

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

Да, это называется отношение подкатегории.
...
Рейтинг: 0 / 0
Связь по трем таблицам
    #38576972
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolidSnakeавторКонечно есть: слить table1 и table2 в одну table, тогда foreign key это всё что нужно.
Это конечно не вариант. Я привел простые таблицы.


Это единственный вариант.
Не, ну можно ещё подкатегорию сделать не в ссылаемой сущности, а в ссылающейся.

Dictionary (dict_id, ...)
UserDictionary (dict_id, User_id, ...)
RoleDictionary (dict_id, Role_id, ...)

Но что-то мне подсказывает, что по сущности предметной области именно наследование User & Role от одного предка будет более правильно.

SolidSnakeА что если таблица1 - "Роли", таблица2 - "Пользователи"? сливать это в отду таблицу - значит сделать себе море проблем в запросах.


Никаких проблем.

SolidSnakeСлив таблиц не подходит еще потому, что имена колонок в "TClassExt" должны совпадать с "TClass".

Похоже ты не понимаешь до конца, как это делается. Найди как реализуется отношение подкатегории, тут (в моих постах в том числе) или ещё можно поглядеть документацию по Hibernate, как там реализуется наследование, но там реализуются все возможные способы, их порядка пяти, тебе же нужен только один, "каждому классу своя таблица".
Впрочем, и другие методы там описанные возможно тебе пригодятся.
...
Рейтинг: 0 / 0
Связь по трем таблицам
    #38576973
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolidSnakeА как такой вариант:
Создаем таблицу ссылок, состоящую из GUID и Варчара с именем таблицы откуда guid был заполнен.
К этой таблице цепляем таблицу 1 и 2. При добавлении записи в таблицу 1 или 2, guid будет дублироваться в таблице ссылок.
Из Dictionary можно ссылаться на таблицу ссылок вместо исходных таблиц.

Это -- полный бред.
Это хорошо было бы поместить в статью "Дети, запомните, как не надо проектировать реляционные БД", более мысль ни на что не годная.
...
Рейтинг: 0 / 0
Связь по трем таблицам
    #38576977
Бредятина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наименование есть и у товаров и у поставщиков (покупателей). Значит выносим в отдельную таблицу...
Дата есть у любой операции - и у выдачи зарплаты, и у оприходования сырья, и у начисления износа... Значит выносим в отдельную таблицу...
См. в связи с этим архитектуру данных в drupal.
...
Рейтинг: 0 / 0
Связь по трем таблицам
    #38577200
SolidSnake
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторКак это делается в системах управления базами данных (СУБД), в отличие от используемой Вами системы хранения и обработки данных (СХОД).
Есть объекты A, B, C, D, ... (в Вашем примере две таблицы - table1 и table 2 - очевидно, что их может быть сколько угодно, и они могут представлять различные типы сущностей, которые нельзя "сливать").
Создаем объект Ob и объявляем связи 1:1 этого объекта с каждым из объектов A, B, C, D...
Это похоже на то что я писал:
авторСоздаем таблицу ссылок, состоящую из GUID и Варчара с именем таблицы откуда guid был заполнен.
К этой таблице цепляем таблицу 1 и 2. При добавлении записи в таблицу 1 или 2, guid будет дублироваться в таблице ссылок.
Из Dictionary можно ссылаться на таблицу ссылок вместо исходных таблиц.

авторНе, ну можно ещё подкатегорию сделать не в ссылаемой сущности, а в ссылающейся.
Dictionary (dict_id, ...)
UserDictionary (dict_id, User_id, ...)
RoleDictionary (dict_id, Role_id, ...)
В целом похоже на мое предложение, только я PK к таблицам "UserDictionary" и "RoleDictionary" не указал.
Конечно они не будут лишними.

авторЭто -- полный бред.
Отличие от моего второго варианта только в наличии PK у таблиц UserDictionary и RoleDictionary.

авторИзбыточный. Не мелочись и перенеси в "таблицу ссылок" атрибуты (поля), общие у таблиц 1 и
2. Мой телепатер утверждает, что одна из таблиц при этом полностью опустеет и может быть
удалена. О чём тебе и твердят весь топик.
Таблица ссылок может содержать ссылки на сотни разных объектов.
Понятно, что можно в таблицу ссылок добавить общие поля.
Но все равно, не общие поля останутся в отдельных таблицах. И когда мне надо будет получить все поля объекта, я должен буду каждый раз соединяться с таблицей ссылок да еще выбирать из нее только те поля, которые относятся к выбираемому объекту.
Куда лучше, когда таблица у каждого класса своя, запросы проще и запутаться меньше шансов. Собственно, MasterZiv и Бредятина подтвердили что есть другой более удобный способ.
...
Рейтинг: 0 / 0
Связь по трем таблицам
    #38577219
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolidSnakeНо все равно, не общие поля останутся в отдельных таблицах.
Когда один объект наследуется от другого, у родительского объекта не общих полей быть не
может.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Связь по трем таблицам
    #38577257
Бредятина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot SolidSnake]авторКак это делается в системах управления базами данных (СУБД), в отличие от используемой Вами системы хранения и обработки данных (СХОД).
Есть объекты A, B, C, D, ... (в Вашем примере две таблицы - table1 и table 2 - очевидно, что их может быть сколько угодно, и они могут представлять различные типы сущностей, которые нельзя "сливать").
Создаем объект Ob и объявляем связи 1:1 этого объекта с каждым из объектов A, B, C, D...
Это похоже на то что я писал:
авторСоздаем таблицу ссылок, состоящую из GUID и Варчара с именем таблицы откуда guid был заполнен.
К этой таблице цепляем таблицу 1 и 2. При добавлении записи в таблицу 1 или 2, guid будет дублироваться в таблице ссылок.
Из Dictionary можно ссылаться на таблицу ссылок вместо исходных таблиц.
В реляционных системах связи между типами сущностей не поддерживаются. Связи, как и сами типы сущностей моделируются с помощью отношений.
Так что, если говорить об аналогиях, то решение для реляционной системы заключается в следующем.
1) Отношения A, B, C, D...
2) Отношение Ob (Ваша Dictionary).
3) Отношения, моделирующие связи 1:1 (в каждом по два FK): Ob-A, Ob-B, Ob-C, Ob-D...
Дальше - детали реализации. В СУБД Вы, например, просто запрещаете создание связей между существующими экземплярами (или объявляете связь со стороны Ob обязательной) - тогда создание экземпляра Ob осуществляется в рамках стандартной процедуры "Создать и связать". И, как Вы писали, для объектов A, B, C, D... пишутся триггеры Before Delete для удаления экземпляра Ob. То есть, трагедии современных РСХОД, описанной в
15648085
в СУБД просто не существует))
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Связь по трем таблицам
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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