Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Связь многие ко многим / 13 сообщений из 13, страница 1 из 1
23.03.2006, 21:32
    #33621821
MelancholicV
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь многие ко многим
Приложение разрабатываеться на базе Delphi 6.0.
Проблема следующая. Есть две реляционные БД.
Одна - база с договорами. Вторая - база с платежами по данным договорам.
Как по одному договору может быть несколько платежей, так и один платеж может быть по нескольким договорам. Т.е. необходимо реализовать связь многие ко многим. Насколько мне известно, общепринятого решения этой задачи нет. Идей две. Обе мне не нравятся, так что если есть более простое решение или другие альтернативные пути решения просьба поделиться.

Первый путь:
Создаеться промежуточная база которая с каждой из БД в отношении один к одному. Т.е. она связывает одну запись платежей с одной записью договоров.
Дальше уже дело построения запроса.
Плюсы - кое как решает проблему.
Минусы - громоздко и ужасно неудобно, некоторые ограничения при обработке.

Второй путь:
Поле в базе договоров, ссылающееся на ключ в проплатах делается типа Memo и каждый ключ проплат заноситься новой строкой, заключенной в какие-нибудь специфические символы (для удобства дальнейшего использования с like).
Плюсы - опять же кое-какое решение проблемы, и никаких ограничений в обработке.
Минусы - довольно сложный код, по сравнению с другими видами связей, громоздко.

Кто-то решал подобные задачи? Делитесь :)

p.s. Может уже вопрос поднимался. Но поиск по форуму результатов не дал.
...
Рейтинг: 0 / 0
23.03.2006, 21:50
    #33621851
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь многие ко многим
MelancholicV
Думаю, как только Вы начнете решать задачу не на Delphi, а на SQL, Вы обнаружите, что все совсем не так, как Вы оцениваете. И, кстати, не стоит употреблять слово "база" в значении слова "таблица".

MelancholicVp.s. Может уже вопрос поднимался. Но поиск по форуму результатов не дал.
Это был какой-то неправильный поиск. Только я раза два отвечал в подобных темах.
...
Рейтинг: 0 / 0
23.03.2006, 21:52
    #33621857
MelancholicV
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь многие ко многим
softwarer MelancholicV
Думаю, как только Вы начнете решать задачу не на Delphi, а на SQL, Вы обнаружите, что все совсем не так, как Вы оцениваете. И, кстати, не стоит употреблять слово "база" в значении слова "таблица".

MelancholicVp.s. Может уже вопрос поднимался. Но поиск по форуму результатов не дал.
Это был какой-то неправильный поиск. Только я раза два отвечал в подобных темах.

Спасибо. Я еще поищу. Но если те два ответа были похожи на этот, то информативности НОЛЬ. Благодарю.
...
Рейтинг: 0 / 0
23.03.2006, 21:58
    #33621865
MelancholicV
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь многие ко многим
Table1
ID
Table2
ID
Table1_2
ID_Table1
ID_Table2
AnotherTable
ID
ID_Table1
ID_Table2


Если об этом то это случай 1. С промежуточной таблицей, базой, чем кому угодно.
Громоздко. Ищется как раз более простое и элегантное решение.
...
Рейтинг: 0 / 0
23.03.2006, 23:02
    #33621937
Связь многие ко многим
А что громоздкого в стандартном подходе (с промежуточной таблицей)? Вариациями на эту тему является использование VARRAY или NESTED TABLE в Oracle.

Подход с помощью Memo - бред. Ну если только для информационных целей, но никак не для поиска.
...
Рейтинг: 0 / 0
24.03.2006, 08:59
    #33622278
MelancholicV
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь многие ко многим
В случае возможности реализации вложеного запроса никаких проблем нет.
Table1
ID
Table2
ID
AnotherTable
ID
ID_Table1
ID_Table2

Select * From Table2
Where ID IN (Select ID_Table2 From Another
Where ID_Table1 = :ID)
,дге :ID - параметр с значением текущего ключа в Table1.
А вот если вложеные запросы не поддерживаются...
Тогда, лично у меня при, скажем, перемещении по таблице 1, возникает необходимость програмного перебора промежуточной таблицы для выбора всех необходимых записей Таблицы 2. Что очень неудобно. Вариант же с Мэмо позволяет этого избежать, и совершенно спокойно реализовать запрос без необходимости перебора. Но тогда проблемы с организацией занесения ключей в это самое Мэмо.
...
Рейтинг: 0 / 0
24.03.2006, 10:27
    #33622537
Связь многие ко многим
MelancholicVВ случае возможности реализации вложеного запроса никаких проблем нет.
Table1
ID
Table2
ID
AnotherTable
ID
ID_Table1
ID_Table2

Select * From Table2
Where ID IN (Select ID_Table2 From Another
Where ID_Table1 = :ID)
,дге :ID - параметр с значением текущего ключа в Table1.
А вот если вложеные запросы не поддерживаются...
Тогда, лично у меня при, скажем, перемещении по таблице 1, возникает необходимость програмного перебора промежуточной таблицы для выбора всех необходимых записей Таблицы 2. Что очень неудобно. Вариант же с Мэмо позволяет этого избежать, и совершенно спокойно реализовать запрос без необходимости перебора. Но тогда проблемы с организацией занесения ключей в это самое Мэмо.
Никакие вложенные запросы не нужны:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select
    t2.*
from
    Table1 t1,
    Table2 t2,
    AnotherTable at
where t1.ID = at.ID_Table1
    and t2.ID = at.ID_Table2
    --дальше необходимые по смылу задачи ограничения, например:
    and at.ID_Table1 = :ID
А за вариант с Memo я бы вас уволил без разговоров. Перебор будет делать СУБД. Если в таблице окажется довольно большое количество записей, она будет его делать...долго.
...
Рейтинг: 0 / 0
24.03.2006, 11:17
    #33622750
ModelR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь многие ко многим
MelancholicVИщется как раз более простое и элегантное решение.Вы увидите что оно и есть - простое и элегантное, симметричное . Например, когда будете связывать счета-фактуры по договорам с платежами идя от платежа.
...
Рейтинг: 0 / 0
24.03.2006, 16:13
    #33624030
shuklin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь многие ко многим
MelancholicVесли есть более простое решение или другие альтернативные пути решения просьба поделиться.
Первый путь:
...
Второй путь:
...С такими взглядами следует рассмотреть возможность применения ООБД, я серьезно. Их много в природе.
...
Рейтинг: 0 / 0
24.03.2006, 17:07
    #33624257
1024
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь многие ко многим
нет, с таким взглядом нужно учебник какой-нить полистать


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
27.03.2006, 15:06
    #33627341
shuklin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь многие ко многим
1024
нет, с таким взглядом нужно учебник какой-нить полистать
Учебник это во многом перечень общепринятых стереотипов (паттернов проектирования) Судя по применяемой терминологии, ИМХО, паттерны проектирования объектных моделей будут гораздо ближе к изложенным взглядам, чем патеррны, применяемые при проектировании РБД. Рекомендую документацию по ОБД.
...
Рейтинг: 0 / 0
27.03.2006, 15:14
    #33627383
1024
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь многие ко многим
при проектировании РБД. Рекомендую документацию по ОБД.
----------

стереотип это некое мнение не подтверждённое ни теорией ни практикой. В
учебниках обычно такого стараются не допускать


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
19.12.2009, 18:54
    #36375583
igen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь многие ко многим
Вот у меня ещё получилось через Join:

Select t2.* From
(t2 Join tAnother On t2_id = tAnother.t2_id)
Join t1 On t1_id = tAnother.t1_id
Where tAnother.t1_id=:t1_id";
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Связь многие ко многим / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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