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

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

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

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

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

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

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

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


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

Подход с помощью Memo - бред. Ну если только для информационных целей, но никак не для поиска.
...
Рейтинг: 0 / 0
Связь многие ко многим
    #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
Связь многие ко многим
    #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
Связь многие ко многим
    #33622750
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MelancholicVИщется как раз более простое и элегантное решение.Вы увидите что оно и есть - простое и элегантное, симметричное . Например, когда будете связывать счета-фактуры по договорам с платежами идя от платежа.
...
Рейтинг: 0 / 0
Связь многие ко многим
    #33624030
shuklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MelancholicVесли есть более простое решение или другие альтернативные пути решения просьба поделиться.
Первый путь:
...
Второй путь:
...С такими взглядами следует рассмотреть возможность применения ООБД, я серьезно. Их много в природе.
...
Рейтинг: 0 / 0
Связь многие ко многим
    #33624257
Фотография 1024
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нет, с таким взглядом нужно учебник какой-нить полистать


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

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


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Связь многие ко многим
    #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]