Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Связь по трем таблицам / 20 сообщений из 20, страница 1 из 1
28.02.2014, 10:57
    #38575029
SolidSnake
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь по трем таблицам
Добрый день!

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

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

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

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

Можно не полностью таблицы сливать, а вынести GUID + общие поля. И да FK в помощь......
...
Рейтинг: 0 / 0
28.02.2014, 16:52
    #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
28.02.2014, 16:55
    #38575511
SolidSnake
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь по трем таблицам
авторПредставьте себе класс "TClass" и его наследника "TClassExt".
В нашем случае - объект класса "TClass" будет записан в таблицу 1.
Объект класса наследника "TClassExt" должен представлять собой другую таблицу, с теме же колонками + N количество новых (таблица 2).
На картинке имена колонок таблица 1 и 2 не совпадают, но на самом деле должны совпадать)
Еще в таблице 2 можно вообразить пару других колонок. Но сути вопроса про связи это не меняет.
...
Рейтинг: 0 / 0
28.02.2014, 17:21
    #38575544
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь по трем таблицам
SolidSnakeФункцилнальность "Проверочные ограничения" позволит запретить запись
строк, проверяя наличие строки хотябы в одной таблице.
А триггеры на таблицу 1 и 2 нужны для того, чтобы обрабатывать удаление строк, удаляя
чтобы при удалении они также были удалены из таблицы Dictionary.

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

SolidSnakeСлив таблиц не подходит еще потому, что имена колонок в "TClassExt"
должны совпадать с "TClass".
Наоборот: это ещё один довод чтобы их слить вместе.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
28.02.2014, 17:42
    #38575567
SERG1257
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь по трем таблицам
Ищите по форуму по слову "Наследование". Обсуждалось многократно.
В двух словах: ответ в первом же посте у Dimitry Sibiryakov
...
Рейтинг: 0 / 0
01.03.2014, 02:37
    #38575885
Sergei.Agalakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь по трем таблицам
Забудьте вы про триггера.
Кроме того, что уже сказали, есть вариант двух FK к разным родителям из таблицы-потомка, и чек-констрайнта, проверяющего,, что только одно поле FK для записи потомка заполненно, а второе NULL.
...
Рейтинг: 0 / 0
01.03.2014, 14:20
    #38576001
SolidSnake
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь по трем таблицам
А как такой вариант:
Создаем таблицу ссылок, состоящую из GUID и Варчара с именем таблицы откуда guid был заполнен.
К этой таблице цепляем таблицу 1 и 2. При добавлении записи в таблицу 1 или 2, guid будет дублироваться в таблице ссылок.
Из Dictionary можно ссылаться на таблицу ссылок вместо исходных таблиц.
...
Рейтинг: 0 / 0
01.03.2014, 14:22
    #38576004
SolidSnake
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь по трем таблицам
авторК этой таблице цепляем таблицу 1 и 2.
PK будет в таблице ссылок.
...
Рейтинг: 0 / 0
01.03.2014, 14:28
    #38576007
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь по трем таблицам
SolidSnakeА как такой вариант:
Избыточный. Не мелочись и перенеси в "таблицу ссылок" атрибуты (поля), общие у таблиц 1 и
2. Мой телепатер утверждает, что одна из таблиц при этом полностью опустеет и может быть
удалена. О чём тебе и твердят весь топик.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.03.2014, 23:15
    #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
03.03.2014, 12:45
    #38576704
Бредятина
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь по трем таблицам
БредятинаСоздаем объект Ob и объявляем связи 1:М этого объекта с каждым из объектов A, B, C, D...
Извиняюсь, 1:1, конечно)
...
Рейтинг: 0 / 0
03.03.2014, 15:31
    #38576957
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь по трем таблицам
lLocustDimitry Sibiryakov, SolidSnake,

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

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

Да, это называется отношение подкатегории.
...
Рейтинг: 0 / 0
03.03.2014, 15:39
    #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
03.03.2014, 15:41
    #38576973
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь по трем таблицам
SolidSnakeА как такой вариант:
Создаем таблицу ссылок, состоящую из GUID и Варчара с именем таблицы откуда guid был заполнен.
К этой таблице цепляем таблицу 1 и 2. При добавлении записи в таблицу 1 или 2, guid будет дублироваться в таблице ссылок.
Из Dictionary можно ссылаться на таблицу ссылок вместо исходных таблиц.

Это -- полный бред.
Это хорошо было бы поместить в статью "Дети, запомните, как не надо проектировать реляционные БД", более мысль ни на что не годная.
...
Рейтинг: 0 / 0
03.03.2014, 15:45
    #38576977
Бредятина
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь по трем таблицам
Наименование есть и у товаров и у поставщиков (покупателей). Значит выносим в отдельную таблицу...
Дата есть у любой операции - и у выдачи зарплаты, и у оприходования сырья, и у начисления износа... Значит выносим в отдельную таблицу...
См. в связи с этим архитектуру данных в drupal.
...
Рейтинг: 0 / 0
03.03.2014, 19:18
    #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
03.03.2014, 19:38
    #38577219
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь по трем таблицам
SolidSnakeНо все равно, не общие поля останутся в отдельных таблицах.
Когда один объект наследуется от другого, у родительского объекта не общих полей быть не
может.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
03.03.2014, 20:56
    #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]