Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Проектирование однотипных данных с разными связями на другие таблицы / 25 сообщений из 47, страница 1 из 2
24.06.2016, 17:01
    #39262004
Проектирование однотипных данных с разными связями на другие таблицы
Всем добрый день)

У меня возникла довольно интересная задача, которую я сомневаюсь как реализовать.

В задаче есть Программы, у Программ есть Подпрограммы. То есть Подпрограммы должны быть связаны с Программами как многие к одному.
Так же есть Мероприятия, которые могут быть и у Программ и у Подпрограмм (сами данные в Мероприятиях одинаковые).
И есть Показатели, которые могут быть и Мероприятий, и у Подпрограмм, и у Программ (данные в Показателях также одинаковые).

У меня пока есть три варианта:
1) реализовать все Мероприятия в одной таблице и Показатели в другой таблице. У Мероприятий сделать два внешних ключа на Подпрограммы и Программы. У Показателей 3: на Мероприятия, Подпрограммы, и Программы;
2) реализовать схему Программы <- Подпрограммы <- Мероприятия <- Показатели. В Подпрограммах и Мероприятиях создавать ненужные элементы с наименованием "Отсутствует", чтобы, например, если Мероприятие должно быть у Программы, то его можно было привязать к её Подпрограмме "Отсутствует";
3) реализовать Мероприятия в 3-х таблицах и Показатели в 2-х.

Хотелось бы у вас спросить, как мне лучше и правильнее реализовать данную задачу. Заранее спасибо)

Модератор: Тема перенесена из форума "Microsoft SQL Server".
...
Рейтинг: 0 / 0
27.06.2016, 16:40
    #39263062
SERG1257
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проектирование однотипных данных с разными связями на другие таблицы
>лучше и правильнее
Давайте свои критерии лучшести и правильности, например
Объем базы, критичные запросы, требования к времени отклика
Если человек не знает куда он плывет - то для него нет попутного ветра. (С) Сенека
...
Рейтинг: 0 / 0
27.06.2016, 17:16
    #39263080
Проектирование однотипных данных с разными связями на другие таблицы
SERG1257,

Объём базы очень маленький 1 Гб, критичных запросов нет, требований к времени отклика тоже нет (с таким объёмом всё должно летать).
Меня просто интересует классический подход к решению таких задач. Первый раз с такой столкнулся)
...
Рейтинг: 0 / 0
27.06.2016, 18:26
    #39263125
SERG1257
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проектирование однотипных данных с разными связями на другие таблицы
Ну если просто по феншую, то мне первый вариант больше нравится. Добавьте check на таблицы Мероприятий и Показателей чтобы заполненной была только одна ссылка из двух (трех)
...
Рейтинг: 0 / 0
27.06.2016, 18:46
    #39263134
Кот Матроскин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проектирование однотипных данных с разными связями на другие таблицы
Есть еще один вариант - "Наследование в рамках РМД".
Сделать сущности "ВладелецМероприятий", "ВладелецПоказателей" и установить связи 1:0..1
c Вашими "Программами", "Подпрограммами" и т.п.
...
Рейтинг: 0 / 0
27.06.2016, 18:54
    #39263137
Egoр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проектирование однотипных данных с разными связями на другие таблицы
Марков Илья,

Я бы программы и подпрограммы положил в одну иерархическую таблицу, а показатели реализовал как EAV. Мероприятия остались бы простой таблицей.
...
Рейтинг: 0 / 0
28.06.2016, 00:21
    #39263298
Проектирование однотипных данных с разными связями на другие таблицы
SERG1257Ну если просто по феншую, то мне первый вариант больше нравится. Добавьте check на таблицы Мероприятий и Показателей чтобы заполненной была только одна ссылка из двух (трех)

Ну вот мне первый вариант тоже больше нравится.

Кот МатроскинЕсть еще один вариант - "Наследование в рамках РМД".
Сделать сущности "ВладелецМероприятий", "ВладелецПоказателей" и установить связи 1:0..1
c Вашими "Программами", "Подпрограммами" и т.п.

Можно немножко поподробнее, пожалуйста. Если я правильно понимаю, то появляется промежуточный слой таблиц. "ВладелецМероприятий" будет связано с "Программами" и "Подпрограммами", а "ВладелецПоказателей" с "Программами", "Подпрограммами" и "Мероприятиями". А сами "Мероприятия" и "Показатели" будут иметь связь многие к одному с "ВладелецМероприятий" и "ВладелецПоказателей" соответственно.

Если это так, то чем данная реализация отличается от первого варианта (кроме как вытаскивания внешних ключей в базовые таблицы)?

EgoрЯ бы программы и подпрограммы положил в одну иерархическую таблицу, а показатели реализовал как EAV. Мероприятия остались бы простой таблицей.

Программы и Подпрограммы в одну иерархию запихнуть не могу. Существуют ещё множество таблиц. Я потом на этом собаку съем) К тому же Программы уже предполагается сделать иерархией для хранения шапок Программ и их различных версий.
...
Рейтинг: 0 / 0
28.06.2016, 00:59
    #39263317
Кот Матроскин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проектирование однотипных данных с разными связями на другие таблицы
Марков ИльяКот МатроскинЕсть еще один вариант - "Наследование в рамках РМД".
Сделать сущности "ВладелецМероприятий", "ВладелецПоказателей" и установить связи 1:0..1
c Вашими "Программами", "Подпрограммами" и т.п.

Можно немножко поподробнее, пожалуйста. Если я правильно понимаю, то появляется промежуточный слой таблиц. "ВладелецМероприятий" будет связано с "Программами" и "Подпрограммами", а "ВладелецПоказателей" с "Программами", "Подпрограммами" и "Мероприятиями".
Нет.
Не "ВладелецМероприятий" будет связан с "Программами" и "Подпрограммами", а "Программы" и "Подпрограммы" будут связаны с "ВладельцемМероприятий".

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Create table EventOwner (IDEventOwner,
                                  ....)

Create table Program (IDEventOwner,
                              ...)
Create table SubProgram ( IDEventOwner,
                                   ...)
Create table Event (IDEvent, 
                           IDEventOwner,
                           ....)
...
Рейтинг: 0 / 0
28.06.2016, 08:37
    #39263379
Egoр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проектирование однотипных данных с разными связями на другие таблицы
Марков ИльяК тому же Программы уже предполагается сделать иерархией для хранения шапок Программ и их различных версий.По мне, так скорее версии нужно в отдельную таблицу складывать, чем объединять их с Программами в одной.
У каждого свои собаки на ужин. :))
Кстати, про версионность Программ в вашей задачке не было ни слова. Может и еще что-нибудь забыли?
...
Рейтинг: 0 / 0
28.06.2016, 09:18
    #39263407
Проектирование однотипных данных с разными связями на другие таблицы
Кот Матроскин,

Не совсем понимаю, в чем преимущества данного метода и сущностей владельцев?
...
Рейтинг: 0 / 0
28.06.2016, 09:21
    #39263413
Проектирование однотипных данных с разными связями на другие таблицы
Egoр,

У меня версионность Программ с полным их содержимым. Решил хранить все в одних таблицах, так как объем небольшой + часто нужен доступ как к последним версиям, так и к стареньким.
Версионность вообще конечно можно опустить, мне бы без неё увидеть хорошие методы решения моей задачи. Кстати, спасибо за наводку на EAV, тоже не плохой вариант)
...
Рейтинг: 0 / 0
28.06.2016, 09:41
    #39263430
Кот Матроскин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проектирование однотипных данных с разными связями на другие таблицы
Марков Илья,

Как минимум ее гораздо проще расширять - при добавлении еще одной сущности, которая может обладать мероприятиями или показателями, существующие таблицы не меняются никак. У Вас показатели могут быть у трех сущностей - а если бы у 10-ти? В Вашем первом варианте делали бы 10 ссылок?
...
Рейтинг: 0 / 0
28.06.2016, 09:48
    #39263440
Проектирование однотипных данных с разными связями на другие таблицы
Кот Матроскин,

Но ведь тогда в данной ситуации будет обратная сторона монеты. Если у Программ и Подпрограмм помимо Мероприятий и Показателей было бы что-то ещё, то тогда было бы ещё больше Владельцев и внешних ключей на них. Но думаю, если такое пойдёт, то уже EAV реально в помощь.
...
Рейтинг: 0 / 0
28.06.2016, 09:58
    #39263451
Кот Матроскин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проектирование однотипных данных с разными связями на другие таблицы
Марков ИльяКот Матроскин,

Но ведь тогда в данной ситуации будет обратная сторона монеты. Если у Программ и Подпрограмм помимо Мероприятий и Показателей было бы что-то ещё, то тогда было бы ещё больше Владельцев и внешних ключей на них.
Не совсем - в данном случае, например, не нужно два ключа, достаточно одного, поскольку
"ВладельцаМероприятий" можно точно так же унаследовать от "ВладельцаПоказателей".
...
Рейтинг: 0 / 0
28.06.2016, 10:07
    #39263458
Проектирование однотипных данных с разными связями на другие таблицы
Кот Матроскин,

А, теперь понятно) а это не считается слишком запутанной архитектурой БД?
...
Рейтинг: 0 / 0
28.06.2016, 10:22
    #39263472
Кот Матроскин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проектирование однотипных данных с разными связями на другие таблицы
Марков Илья,

Мной - не считается :) В сравнении с EAV это имхо ясная и стройная архитектура.
Обратите внимание, что в большинстве запросов эти дополнительные таблицы не нужны и, соответственно, их не усложняют - они только обеспечивают ссылочную целостность.
...
Рейтинг: 0 / 0
28.06.2016, 10:27
    #39263477
Проектирование однотипных данных с разными связями на другие таблицы
Кот МатроскинМарков Илья,

Обратите внимание, что в большинстве запросов эти дополнительные таблицы не нужны

Почему же? Чтобы в одном запросе, например, вытащить Программы и Мероприятия, мне нужно всё равно по доп. таблице пробежаться.
...
Рейтинг: 0 / 0
28.06.2016, 10:34
    #39263482
Кот Матроскин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проектирование однотипных данных с разными связями на другие таблицы
Марков ИльяКот МатроскинМарков Илья,

Обратите внимание, что в большинстве запросов эти дополнительные таблицы не нужны

Почему же? Чтобы в одном запросе, например, вытащить Программы и Мероприятия, мне нужно всё равно по доп. таблице пробежаться.

Выбрать Программы и Мероприятия этих программ? зачем для этого дополнительная таблица?

Код: sql
1.
2.
3.
4.
...
from Programs p
      left join Events e
      on p.IDEventOwner = e.IDEventOwner
...
Рейтинг: 0 / 0
28.06.2016, 10:38
    #39263486
Проектирование однотипных данных с разными связями на другие таблицы
Кот Матроскин,

Блин, и вправду) я почему-то не подумал о соединении сразу по внешним ключам. Спасибо за оригинальную идею!
...
Рейтинг: 0 / 0
28.06.2016, 10:39
    #39263488
Проектирование однотипных данных с разными связями на другие таблицы
Кот Матроскин,

Но если делать наследование владельцев, чтобы вытащить Программы с Показателями нужно всё равно же пробежаться по Владельцам Мероприятий? Или я опять туплю)))
...
Рейтинг: 0 / 0
28.06.2016, 16:39
    #39264003
SERG1257
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проектирование однотипных данных с разными связями на другие таблицы
Марков Илья Но если делать наследование владельцев, чтобы вытащить Программы с Показателями нужно всё равно же пробежаться по Владельцам Мероприятий?Да ты должен будешь сделать left join со ВСЕМИ таблицами, но так как у тебя есть сквозная нумерация IDEventOwner (для чего собственно таблица EventOwner и нужна) то в результате будет только то что надо.

Версионность (постановку задачи) тоже тут вываливай. Одна из популярных тем здесь, наряду с наследованием, таблицами с неизвестной структурой (EAV).
...
Рейтинг: 0 / 0
28.06.2016, 16:45
    #39264008
SERG1257
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проектирование однотипных данных с разными связями на другие таблицы
Добавлю ключи
Код: sql
1.
2.
3.
4.
5.
6.
7.
Create table EventOwner (IDEventOwner int primary key identity,
Create table Program (IDEventOwner int primary key references EventOwner ,
                              ...)
Create table SubProgram ( IDEventOwner int primary key references EventOwner, prog_id int references Program,
                                   ...)
Create table Event (IDEvent int primary key, 
                           IDEventOwner int references EventOwner,
...
Рейтинг: 0 / 0
28.06.2016, 16:46
    #39264009
Egoр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проектирование однотипных данных с разными связями на другие таблицы
Кот Матроскин,SERG1257 для чего собственно таблица EventOwner и нужна Для чего нужна таблица EventOwner?
...
Рейтинг: 0 / 0
28.06.2016, 17:22
    #39264051
SERG1257
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проектирование однотипных данных с разными связями на другие таблицы
Egoр Для чего нужна таблица EventOwner? Для того чтобы на нее наложить ограничение уникальности или первичного ключа
Также туда можно засунуть другие общие поля типа short_name, full_description, date_create, date_last_changed etc.
...
Рейтинг: 0 / 0
28.06.2016, 18:17
    #39264107
Проектирование однотипных данных с разными связями на другие таблицы
SERG1257Да ты должен будешь сделать left join со ВСЕМИ таблицами

Ну разве что по Владельцам показателей не надо)

EgoрДля чего нужна таблица EventOwner?

Для вытаскивания всех владельцев мероприятий (то есть Программ, Подпрограмм и др. таблиц, которые могут появиться в дальнейшем) в одну базовую таблицу, на которую и будут ссылаться все Мероприятия.

SERG1257Также туда можно засунуть другие общие поля типа short_name, full_description, date_create, date_last_changed etc.

Не понимаю, общие поля чего?

SERG1257Версионность (постановку задачи) тоже тут вываливай. Одна из популярных тем здесь, наряду с наследованием, таблицами с неизвестной структурой (EAV).

Задача состоит в реализации полного архивирования Программы (со всеми внутренностями) и копирования её для внесения дальнейших изменений по запросу пользователя.

Архивы и текущие версии Программ собираюсь хранить в этих же таблицах (данных мало, запросы к архивам будут не редкие). Саму таблицу Программ буду делать в виде иерархии: один уровень - шапка Программы, второй уровень - её версии. Всё остальное в виде обычных таблиц.
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Проектирование однотипных данных с разными связями на другие таблицы / 25 сообщений из 47, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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