|
|
|
Связь по трем таблицам
|
|||
|---|---|---|---|
|
#18+
Добрый день! Есть ли способ, ключами ораганизовать следующие ограничения: В таблице "Dictionary", должно быть возможно внести GUID, который содержится хотя бы в одной из таблиц Table. При этом, "table 1" и "table 2" всегда содержат не совпадающие GUID. Как мне представляется, можно выключить ограничения внешнего ключа (или удалить его полность), Добавить "Проверочные ограничения" в таблицу "Dictionary", а в table1 и 2 триггеры на удаление. Или есть другой способ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2014, 10:57 |
|
||
|
Связь по трем таблицам
|
|||
|---|---|---|---|
|
#18+
SolidSnakeИли есть другой способ? Конечно есть: слить table1 и table2 в одну table, тогда foreign key это всё что нужно. PS: Триггерами эту задачу не решить в принципе. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2014, 14:32 |
|
||
|
Связь по трем таблицам
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, SolidSnake, Можно не полностью таблицы сливать, а вынести GUID + общие поля. И да FK в помощь...... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2014, 14:57 |
|
||
|
Связь по трем таблицам
|
|||
|---|---|---|---|
|
#18+
авторКонечно есть: слить table1 и table2 в одну table, тогда foreign key это всё что нужно. Это конечно не вариант. Я привел простые таблицы. А что если таблица1 - "Роли", таблица2 - "Пользователи"? сливать это в отду таблицу - значит сделать себе море проблем в запросах. авторPS: Триггерами эту задачу не решить в принципе. Функцилнальность "Проверочные ограничения" позволит запретить запись строк, проверяя наличие строки хотябы в одной таблице. А триггеры на таблицу 1 и 2 нужны для того, чтобы обрабатывать удаление строк, удаляя чтобы при удалении они также были удалены из таблицы Dictionary. авторМожно не полностью таблицы сливать, а вынести GUID + общие поля. Я объясню чуть больше, зачем я спрашиваю :) Представьте себе класс "TClass" и его наследника "TClassExt". В нашем случае - объект класса "TClass" будет записан в таблицу 1. Объект класса наследника "TClassExt" должен представлять собой другую таблицу, с теме же колонками + N количество новых (таблица 2). Есть еще другой объект, который хранится в таблице dictionary, одно из полей которого, ссылка объект "TClass" или ссылка на объект наследника "TClassExt". Слив таблиц не подходит еще потому, что имена колонок в "TClassExt" должны совпадать с "TClass". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2014, 16:52 |
|
||
|
Связь по трем таблицам
|
|||
|---|---|---|---|
|
#18+
авторПредставьте себе класс "TClass" и его наследника "TClassExt". В нашем случае - объект класса "TClass" будет записан в таблицу 1. Объект класса наследника "TClassExt" должен представлять собой другую таблицу, с теме же колонками + N количество новых (таблица 2). На картинке имена колонок таблица 1 и 2 не совпадают, но на самом деле должны совпадать) Еще в таблице 2 можно вообразить пару других колонок. Но сути вопроса про связи это не меняет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2014, 16:55 |
|
||
|
Связь по трем таблицам
|
|||
|---|---|---|---|
|
#18+
SolidSnakeФункцилнальность "Проверочные ограничения" позволит запретить запись строк, проверяя наличие строки хотябы в одной таблице. А триггеры на таблицу 1 и 2 нужны для того, чтобы обрабатывать удаление строк, удаляя чтобы при удалении они также были удалены из таблицы Dictionary. Пофиг. Ссылочная целостность на триггерах в современных РСУБД в многопользовательском режиме не работает. Точка. SolidSnakeСлив таблиц не подходит еще потому, что имена колонок в "TClassExt" должны совпадать с "TClass". Наоборот: это ещё один довод чтобы их слить вместе. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2014, 17:21 |
|
||
|
Связь по трем таблицам
|
|||
|---|---|---|---|
|
#18+
Ищите по форуму по слову "Наследование". Обсуждалось многократно. В двух словах: ответ в первом же посте у Dimitry Sibiryakov ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2014, 17:42 |
|
||
|
Связь по трем таблицам
|
|||
|---|---|---|---|
|
#18+
Забудьте вы про триггера. Кроме того, что уже сказали, есть вариант двух FK к разным родителям из таблицы-потомка, и чек-констрайнта, проверяющего,, что только одно поле FK для записи потомка заполненно, а второе NULL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2014, 02:37 |
|
||
|
Связь по трем таблицам
|
|||
|---|---|---|---|
|
#18+
А как такой вариант: Создаем таблицу ссылок, состоящую из GUID и Варчара с именем таблицы откуда guid был заполнен. К этой таблице цепляем таблицу 1 и 2. При добавлении записи в таблицу 1 или 2, guid будет дублироваться в таблице ссылок. Из Dictionary можно ссылаться на таблицу ссылок вместо исходных таблиц. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2014, 14:20 |
|
||
|
Связь по трем таблицам
|
|||
|---|---|---|---|
|
#18+
авторК этой таблице цепляем таблицу 1 и 2. PK будет в таблице ссылок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2014, 14:22 |
|
||
|
Связь по трем таблицам
|
|||
|---|---|---|---|
|
#18+
SolidSnakeА как такой вариант: Избыточный. Не мелочись и перенеси в "таблицу ссылок" атрибуты (поля), общие у таблиц 1 и 2. Мой телепатер утверждает, что одна из таблиц при этом полностью опустеет и может быть удалена. О чём тебе и твердят весь топик. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2014, 14:28 |
|
||
|
Связь по трем таблицам
|
|||
|---|---|---|---|
|
#18+
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... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2014, 23:15 |
|
||
|
Связь по трем таблицам
|
|||
|---|---|---|---|
|
#18+
БредятинаСоздаем объект Ob и объявляем связи 1:М этого объекта с каждым из объектов A, B, C, D... Извиняюсь, 1:1, конечно) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2014, 12:45 |
|
||
|
Связь по трем таблицам
|
|||
|---|---|---|---|
|
#18+
lLocustDimitry Sibiryakov, SolidSnake, Можно не полностью таблицы сливать, а вынести GUID + общие поля. И да FK в помощь...... Это понятно, что Воскресенье -- праздник. Только автор не дал другие атрибуты этих сущностей, кроме PK. Вот PK и общие атрибуты надо сливать, а необщие атрибуты останутся каждый в своей таблице. Да, это называется отношение подкатегории. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2014, 15:31 |
|
||
|
Связь по трем таблицам
|
|||
|---|---|---|---|
|
#18+
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, как там реализуется наследование, но там реализуются все возможные способы, их порядка пяти, тебе же нужен только один, "каждому классу своя таблица". Впрочем, и другие методы там описанные возможно тебе пригодятся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2014, 15:39 |
|
||
|
Связь по трем таблицам
|
|||
|---|---|---|---|
|
#18+
SolidSnakeА как такой вариант: Создаем таблицу ссылок, состоящую из GUID и Варчара с именем таблицы откуда guid был заполнен. К этой таблице цепляем таблицу 1 и 2. При добавлении записи в таблицу 1 или 2, guid будет дублироваться в таблице ссылок. Из Dictionary можно ссылаться на таблицу ссылок вместо исходных таблиц. Это -- полный бред. Это хорошо было бы поместить в статью "Дети, запомните, как не надо проектировать реляционные БД", более мысль ни на что не годная. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2014, 15:41 |
|
||
|
Связь по трем таблицам
|
|||
|---|---|---|---|
|
#18+
Наименование есть и у товаров и у поставщиков (покупателей). Значит выносим в отдельную таблицу... Дата есть у любой операции - и у выдачи зарплаты, и у оприходования сырья, и у начисления износа... Значит выносим в отдельную таблицу... См. в связи с этим архитектуру данных в drupal. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2014, 15:45 |
|
||
|
Связь по трем таблицам
|
|||
|---|---|---|---|
|
#18+
авторКак это делается в системах управления базами данных (СУБД), в отличие от используемой Вами системы хранения и обработки данных (СХОД). Есть объекты 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 и Бредятина подтвердили что есть другой более удобный способ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2014, 19:18 |
|
||
|
Связь по трем таблицам
|
|||
|---|---|---|---|
|
#18+
SolidSnakeНо все равно, не общие поля останутся в отдельных таблицах. Когда один объект наследуется от другого, у родительского объекта не общих полей быть не может. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2014, 19:38 |
|
||
|
Связь по трем таблицам
|
|||
|---|---|---|---|
|
#18+
[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 в СУБД просто не существует)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2014, 20:56 |
|
||
|
|

start [/forum/search_topic.php?author=Durilka&author_mode=last_posts&do_search=1]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
166ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
| others: | 439ms |
| total: | 716ms |

| 0 / 0 |

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