С Новым годом! Форум программистов, компьютерный форум, киберфорум
Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 31.07.2012
Сообщений: 19

Связь между значением атрибута в записи одной таблицы и наименованием сторонней таблицы

31.07.2012, 16:48. Показов 2265. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, уважаемые корифеи! Не удивляйтесь моему вопросу - ответ мне нужен для дипломного проекта. Я - студент из Киева.
Не могу разобраться в очень простой ситуации. Как проектировать схему реляционной БД, если мне нужно моделировать связь между тем или иным значением конкретного атрибута в записи одной таблицы и наименованием сторонней таблицы (или даже именами группы таблиц!). Я так думаю, что такая связь выходит за рамки строгой реляционной модели. Но я никак не могу понять, как тогда моделируется примитивная ситуация, которая возникает во многих ПрО? Попытаюсь ее описать как смогу. Простите мне многословие, если что.
Пусть ПрО - это регистратура в большой поликлинике в большом городе. Куча врачей, куча кабинетов, очередь стоит на регистрацию. Понятно, что все потребности больных регистрируются в одну таблицу РЕГИСТРАТУРА (КодПациента, КодВрача, КодДиагноза, …) подряд. В этой таблице сразу же формируется и их очередь в данный кабинет - или на исследования (на рентген, на УЗИ, на сдачу анализов, на ЭКГ и т.п.), или просто на прим к разным врачам (а наименований их - около 20, не говоря уже о структуре таблиц, каждая из которых отвечает за каждого врача). И что же мы имеем в итоге? Как я понял, типовую ситуацию. То, что зарегистрировано в простом списке (потоке) в таблице РЕГИСТРАТУРА(), со ссылками на справочник врачей, исследований, диагнозов и т.п. сущностей, должно строго связываться с разными сторонними таблицами. На руки больной получает сою очередь в конкретный кабинет конкретного врача - номерок. Все знают, что это - как билет на поезд. Тут все линейно и прозрачно. А вот дальше начинается самое интересное. Приложение же должно формировать подготовительные записи в куче формируемых новых таблиц! Если бы это была одна новая сводная (сплошная) таблица, то проблемы бы не было. Но это - 3-4 десятка разных таблиц! То есть, если атрибут КодВрача равен, скажем, 1 (больной пришел и зарегистрировался к простому терапевту), то нужно создать под него запись в таблице ПРИЕМ ТЕРАПЕВТА (), если атрибут КодВрача равен, скажем, 2 (больной пришел и зарегистрировался к кардиологу), то нужно создать под него запись в таблице ПРИЕМ КАРДИОЛОГА (). И так далее. И что ж получается? Получается, что ничем, кроме как наименованием (и само собой структурой-схемой), эти таблицы различить невозможно! Значит, нужно в справочник ВРАЧИ (КодВрача, Имя врача, ИмяСтороннейТаблицы) вносить нереляционную ссылку «имя сторонней таблицы». Потому, что по иному, как мне кажется, эти таблицы взаимодействовать не будут. А без этого - пролет работы приложения. Я уверен, что ситуация, описанная мною - типовая. И даже классическая. Но почему я ни в одном учебнике по РБД не могу найти ответ на этот вопрос? С чем я столкнулся?
Что я еще думаю. Можно, конечно же, исходить не из таблицы-списка зарегистрированных больных при создании таблиц-приемов врачей, а наоборот. То есть, при формировании информации в приложении конкретного врача терапевта на его компе, прога может цеплять к открытой (текущей) таблице ПРИЕМ ТЕРАПЕВТА (КодВрача, ) фоновую таблицу РЕГИСТРАТУРА (КодВрача, ...) по конкретному значению атрибута КодВрача, прописанному прямо в листинг приложения. Но, как мне кажется, от этого нереляционность не отпадет - хрен редьки не слаще. А разделять «регистрационную» таблицу стразу же на кучу журналов по именам врачей (как делают, например, в ЗАГСЕ – там та же ситуация, кстати), нельзя ни в коме случае. Потому, что там работают процедуры проверки целостности и непротиворечивости очередей в кабинеты. А это можно сделать только на цельной таблице.
Что это за ситуация? Где она описана, в каком учебнике? И как такое моделируют профессионалы по проектированию схем реляционных БД? Потому, что таких ПрО можно привести сотни в пример.
Да, и прошу меня извинить, если совершенно аналогичный вопрос вы обнаружите на других форумах по БД. У меня горит диплом!
Словом, помогите!!!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.07.2012, 16:48
Ответы с готовыми решениями:

Связь многие ко многим между записями из одной таблицы
Существует таблица Records, где хранятся записи, характеристики записи хранятся в справочниках. запись имеет характеристики, например...

Создать любые две таблицы, установить между ними связь, и с помощью запроса показать эту связь
Короче такое задание. Создать любые две таблицы, установить между ними связь и с помощью запроса показать эту связь. Как это сделать?...

Связь между таблицами.Обновление одной записи при обновлении другой записи
Всем привет. Делаю БД для курсового проекта. Есть БД сотрудников организаций. Есть таблица "перевод сотрудников" и таблица...

10
 Аватар для Аватар
5393 / 1465 / 513
Регистрация: 31.05.2012
Сообщений: 5,153
01.08.2012, 22:00
Таблица РЕГИСТРАТУРА
Таблица ВРАЧИ (не мешает добавить код специализации врача)
Между ними для организации отношения многие к многим таблица-связка ПРИЕМ. От неё две внешние ссылки на РЕГИСТРАТУРА и ВРАЧИ. Плюс время, номер талона, возможно еще что-то. В каких учебниках не скажу, ни одного в глаза не видел, но на практике отношение многие к многим именно так реализуются. И не верь, что так нельзя
0
0 / 0 / 0
Регистрация: 31.07.2012
Сообщений: 19
02.08.2012, 02:06  [ТС]
Да-да! Все верно! Вы правы совершенно! В том смысле, что именно так и нужно моделировать М к М. Но я то говорю о другом! Я говорю, что не в данной ПрО существует таблицы ВРАЧИ()! А существует ее куски - слои. Куча таблиц: ТЕРАПЕВТЫ (), КАРДИОЛОГИ(), ЭНДОКРИНОЛОГИ() и т. п. Вот тут то и начинается проблема! Видите ли, никак нельзя слить все таблицы в одну. У них у всех - разные структуры! Если бы можно было в одной - то и вопроса бы не было.
Помогите!!! Что это за ситуация такая, а? Где она описана?

Добавлено через 32 минуты
Пардон, я имел ввиду таблицу ПРИЕМ().
"Между ними для организации отношения многие к многим таблица-связка ПРИЕМ"
То есть, в это ПрО никак нельзя создать сплошную и простую таблицу ПРИЕМ(). В этом же и суть проблемы! А можно работать только со ее слоями - ПРИЕМ_ТЕРАПЕВТОВ(), ПРИЕМ_КАРДИОЛОГОВ() и т.п. Если бы можно было бы работать со сплошной таблицей ПРИЕМ_ВРАЧЕЙ(), то вопроса бы не было бы. Очень прошу - вникните пожалуйста в вопрос! ПОМОГИТЕ ссылкой на литературу, где такое описано?
0
 Аватар для Аватар
5393 / 1465 / 513
Регистрация: 31.05.2012
Сообщений: 5,153
02.08.2012, 07:53
Что-то ты не то рассказываешь. Почему это ПРИЕМ нельзя делать одной таблицей? Вся информация для реализации выборок есть в двух родителях и ничего не мешает делать их (выборки) хоть по специализации врачей, хоть по времени приема и прочее.
0
0 / 0 / 0
Регистрация: 31.07.2012
Сообщений: 19
02.08.2012, 10:34  [ТС]
Уважаемый г-н Аватар! Так вопрос именно в этом. В описанных предметных областях (ПрО) невозможно сделать единой таблицу ПРИЕМ_ВРАЧЕЙ(). Если бы можно было, то все было бы линейно и просто. Проблема в том, что у каждого врача - своя структура таблицы. Они очень отличаются - как холодильник от бутылки водки и от туристической палатки. Поэтому группируются в одну только таблица ТЕРАПЕВТ(), КАРДИОЛОГ(), УРОЛОГ() и т.п. А если же их просто принудительно примитивно состыковать между собой (не соединить, а именно состыковать!), то полученное одоробло будет очень разреженным - как разреженная матрица. А это - тоже фигня. Дикая избуточность. Так точно нельзя. Да и ворочаться такой монстр будет жутко медленно. Представьте себе табличку, в которой по 10 атрибутов умножены на 50 разнообразий - 500 атрибутов практически всегда нули. А в день проходит через регистратуру такого ателье (а что поликлиника, что ателье. что ЗАГС, что супермаркет - все едино) 1000 посетителей. Ну и что это будет за БД?
Очень прошу, подскажите - в каких статьях такое описано? Дайте ссылочку плиз. Потому что мне в этом инетерсет не метод программистского решения (их - множество), а именно теоретический анализ проблемы РМД. У меня диплом на тему проектирования схем БД (а не программирования приложений). Помогите ссылочкой!
0
 Аватар для Аватар
5393 / 1465 / 513
Регистрация: 31.05.2012
Сообщений: 5,153
02.08.2012, 18:25
Есть два варианта решения этой проблемы
Плохой - наплодить для каждой специализации свою таблицу со ссылками на ПРИЕМ и мучаться потом с запросами
Хороший - засунуть все в ПРИЕМ и не мучаться. Решето пусть не пугает, на то он и SQL, чтобы в том числе и NULL-ы хранить. В крайнем случае можно даже разные по смыслу, но одинаковые по типу данных атрибуты хранить в одном поле. Я бы так не делал
0
0 / 0 / 0
Регистрация: 31.07.2012
Сообщений: 19
02.08.2012, 19:55  [ТС]
Понял. Я собственно это и понимал. Но мне дико не нравится решето. Это даже не решето, а монстрище какой то. Да и потом - а как же делать "вьюв" в приложение на каждом рабочем месте? Все равно получается нереляционная ситуация - в хранимую процедуру приложения впихиватеся значение ключа рабочего места, фильтрующего решето! Говнецо все это, если честно. Те же, только в профиль.
А нельзя ли подсказать ссылочку на литературу, где описано такое решето-монстр на 500 полей? (очень меткое между прочим название - метод рекурсивного решета Эйлера - это именно самое то - "вьюв").
0
 Аватар для Аватар
5393 / 1465 / 513
Регистрация: 31.05.2012
Сообщений: 5,153
02.08.2012, 20:28
На каждом рабочем месте никто не мешает свою структуру SELECT-а придумать, или свой VIEW, или хранимую процедуру. Это кому как угодно. Мне удобней динамически формировать SELECT-запрос
0
0 / 0 / 0
Регистрация: 31.07.2012
Сообщений: 19
03.08.2012, 12:20  [ТС]
И еще. Такое огромедное решето будет же очень медленно работать если таких клиентов к ниму - пару сотен одновременно. Это - раз. А второе - получается все та же нереляцоинная ссылка, что и в моем описании. Только она замаскирована в листинге запроса. Какая же разница, а? Ведь все равно же при загрузке приложения на рабочем месте скажем УЗИста процедура запроса в соответствии с значением кода услуги из справочника ИССЛЕДОВАНИЯ (КодУслуги, ...), скажем, 15 - УЗИ, врач-узист получает доступ к отфильтрованному решету. Ему то ведь сто лет в обед не нужно трогать записи в решете об посещении терапевтов, кардиологов и т.п. Что же получается? Та же нереляционная ссылка. То же самое взаимодействие данных и метаданных. Только не в явном виде прямо в справочнике, а замаскировано в листинге хранимой "на века вечные" процедуры запроса. Так что никуда от такого фильтра не деться. Хоть в лоб, хоть по лбу. Ведь так?

Добавлено через 13 часов 50 минут
Я решил свою проблему.
Описанный мною процесс - это действительно классика. Только назван он денормализацией. И ни о каком выходе за пределы РМД речь не идет.
http://www.lcard.ru/~nail/sybase/perf/1088.htm
"Как правило, горизонтальное разделение ... требует различные имена таблиц в запросах, в зависимости от значений в таблице"
Я надеюсь, статья от Сайбес ни у кого не вызовет недоверия? Оказалось, что таких статей в инете - куча.
Но помощь эту я получил не от форумов России. Везде одна и та же картина. Жаль, что корифеи оказались столь не начитанными...
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
03.08.2012, 13:48
Не совсем понятно, к чему вы пришли в итоге? К тому от чего хотели отойти с самого начала?
Цитата Сообщение от АлександрИванов Посмотреть сообщение
То есть, если атрибут КодВрача равен, скажем, 1 (больной пришел и зарегистрировался к простому терапевту), то нужно создать под него запись в таблице ПРИЕМ ТЕРАПЕВТА (), если атрибут КодВрача равен, скажем, 2 (больной пришел и зарегистрировался к кардиологу), то нужно создать под него запись в таблице ПРИЕМ КАРДИОЛОГА (). И так далее. И что ж получается? Получается, что ничем, кроме как наименованием (и само собой структурой-схемой), эти таблицы различить невозможно! Значит, нужно в справочник ВРАЧИ (КодВрача, Имя врача, ИмяСтороннейТаблицы) вносить нереляционную ссылку «имя сторонней таблицы».
Ваша задача - как раз классческая проблема РБД, и решать ее можно разными способами, в том числе и теми, что предлагали здесь. "Серебряной пули" тут нет и не может быть.

PS. Эта проблема, кстати, явилась одной из причин набирания популярности NoSQL баз...
0
0 / 0 / 0
Регистрация: 31.07.2012
Сообщений: 19
03.08.2012, 16:12  [ТС]
Вот, уважаемый г-н Turbqnoff! Теперь мне уже стало понятно, что единственная "серебряная пуля" - это рассекание таблицы на слои. Я это и раньше понимал. Да только никак не мог взять в толк, почему же это такая тупая перепечатка "с чужого голоса" во всех учебниках наблюдается по стандартным вопросам, и такое молчание, если речь идет о проколах РБД. А все очень просто - их авторы в большинстве своем - обычные необъективные невежды. Вот потому то и не находил я этой классики у разных великих "перепечаников" америкосовских монографий типа знаменитого российского гуру от БД (не будем называть фамилий)...
Каждому ведь понятно. что приложение обязано работать с максимальной возможной скоростью, а разработка приложения (читай, схема РБД) должна быть максимально модифицируемой. А это значит, что монстры типа решета должны быть декомпозированы до полного изнеможения. Но Кодд такого не рассматривал. Вот потому то все и молчат, как рыба.
Правда на этот "сплит" намекнул Р. Фейджин в своей знаменитой статье о ДКНФ - он ведь первым предложил отделить "пол" пациента от всех остальных атрибутов. И он там и слова не сказал, что эта операция портит его безаномальную форму. А я просто никак не мог понять, куда же задевалась эта его знаменитая идея? А вот теперь все стало на место. Просто ее назвали странно - "денормализацией". Хотя при внимательном рассмотрении нормальность таблицы только повышается от этого. Потому, что неуправляемые случайные "паразитные" ФЗ, которые могут появляться в решетах, исключаются полностью таким сплитированием.
Так что, увы, уважаемый корифей. Сплитирование талицы - это единственно верное решение. И, как теперь очевидно, оно - строго в рамках реляционки. А вот течение "не только сиквел" - это уже другое, насколько я понял. Но тут еще нужно разбираться.
А с этой проблемой все ясно. Теперь у меня с дипломом - все ок...
Еще раз - всем большое спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.08.2012, 16:12
Помогаю со студенческими работами здесь

Связь одной таблицы с несколькими
доброго времени суток1 подскажите пожалуйста : есть таблица "приказ" с полем "тип приказа" как связать её с таблицами...

Двойная связь одной таблицы с другой
Имеется таблица"органицации" и таблица "документы". Документы включают данные по организациям и контрагентам. Организация может...

Запрос: вывести все записи одной таблицы, и совпадающие записи другой
SELECT .ФИО AS ФИО, .Паспорт AS , .Телефон AS Телефон FROM Source INNER JOIN Compare ON (.ФИО=.ФИО) AND (.Паспорт=.Паспорт); Запрос...

Внешнее поле таблицы заполнить несуществующим значением из другой таблицы
Подскажите, пожалуйста! У меня 2 таблицы связаны между собой по полю "№п" с каскадным обновлением и удалением. Так вот, открываю...

Двойная связь 1 поля таблицы с 2 полями из другой таблицы
в продолжение темы:https://www.cyberforum.ru/ms-access/thread1032853.html есть таблица Название рейсов с полями: -Код названия рейса ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru