Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.04.2014, 00:48   #1
ZHU35
 
Регистрация: 06.11.2009
Сообщений: 5
По умолчанию Проектирование БД для последующего статистического анализа

Подскажите как лучше организовать БД

смысл такой: есть химические элементы(ХЭ), из них можно сделать композицию(К) (кол-во ХМ в К может быть любое, как и их концентрация); эту композицию применяют для некоторого процесса - выходные характеристики процесса должны находится в таблице экспериментальных данных(ЭД).

Для статистического анализа нужно будет искать опыты в таблице ЭД по композиции(К), при этом концентрация ХЭ не важна, главное чтобы в композиции были только выбранные ХЭ.

сейчас схема выглядит так, как в прикрепленной фотке, но это неудобно для поиска.

Возможно у кого-то есть идеи как лучше организовать эту часть базы.
Изображения
Тип файла: jpg Безымянный.jpg (9.8 Кб, 149 просмотров)
ZHU35 вне форума Ответить с цитированием
Старый 25.04.2014, 09:41   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
сейчас схема выглядит так, как в прикрепленной фотке, но это неудобно для поиска.
В чем неудобство?

задача. найти эксперименты с кислородом и(или) водородом
и решение.
Код:
 select id from хэ -- "плохие" элементы
where name not in ('водород','кислород') 

select id_k from состав --композиции с плохими элементами
where id_хэ in ( select id from хэ -- "плохие" элементы
                 where name not in ('водород','кислород')
               )
ОТВЕТ будут выданы все эксперименты в которых был хотя бы один из перечисленных и не было никаких других. А также те где не было ни единого элемента.
Код:
select * from ЭД --правильные опыты   
where id_k not in ( select id_k from состав --композиции с плохими элементами
                    where id_хэ in ( select id from хэ  -- "плохие" элементы
                                     where name not in ('водород','кислород')
                                   ) 
                  )
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 25.04.2014 в 09:46.
evg_m вне форума Ответить с цитированием
Старый 25.04.2014, 15:47   #3
ZHU35
 
Регистрация: 06.11.2009
Сообщений: 5
По умолчанию

неудобство в том что нужно делать очень много подзапросов

это лишь кусочек БД и на самом деле в таблицу с ЭД тянутся еще 2 ветки с такой структурой( ХЭ-СК-К---ЭД)

задача: найти эксперименты кислород + водород и концентрации этих ХЭ. и представить их в виде удобном для анализа.

хотелось бы чтобы возвращался результат как на картинке

мой запрос выглядит так
//с-концентрация

select id,b.с1,b.с2, v
from
(select id_k, sum(if(id_XЭ=1,с,null)) AS с1, sum(if(id_XЭ=2,с,null)) AS с2
from СК where id_k
in (select id_k from СК where id_k in ( select id_k from СК
where id_XЭ in ( 1)) and id_k in ( select id_k from СК
where id_XЭ in ( 2)) and id_k not in ( select id_k from СК
where id_XЭ not in ( 1,2)))
group by id_k) as b, ед
where ед.id_k=b.id_k

он находит все как нужно, но кол-во подзапросов пропорционально кол-ву ХЭ, а если еще 2 такие же ветки добавить, то на запрос будет страшно смотреть..

Итог: мне кажется что это совсем не оптимально, поэтому думаю, что стоит изменить структуру БД
Изображения
Тип файла: jpg 1.jpg (28.6 Кб, 152 просмотров)

Последний раз редактировалось ZHU35; 25.04.2014 в 18:07.
ZHU35 вне форума Ответить с цитированием
Старый 28.04.2014, 09:44   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
select id, x1.c as c1, x2.c as c2, v
from ck --берем "все" опыты (см. комментарий к where)
inner join --"из них отбираем" только те котрые включают водород вместе с его характеристиками(поле с)  для данного опыта(!)
          (select id_k, c, xэ.id from ck inner join хэ on хэ.id =ck.id_хэ where хэ.name='водород') as x1 on ck.id =x1.id_k
inner join --"из них отбираем" кислород
           (select id_k, c, хэ.id from ck inner join хэ on хэ.id =ck.id_хэ where name='кислород') as x2 on ck.id =x2.id_k
... --если надо из них выбираем по третьему и т.д. элементу
where --напоследок (по написанию, но не выполнению) исключаем все плохие (используют другие элементы)
ck.id_k not in ( select id_k from состав --композиции с плохими элементами
                       where id_хэ in ( select id from хэ  -- "плохие" элементы
                                        where name not in ('водород','кислород')
                                      ) 
                     )
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 28.04.2014 в 09:57.
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
считывание строки из файла для последующего редактирования AFA Общие вопросы C/C++ 10 19.11.2013 07:15
Запись функции в файл для ее последующего вызова wol4aravio C# (си шарп) 0 24.05.2012 22:55
разработка программной оболочки методом решения задач много мерного статистического анализа distipl Помощь студентам 0 05.04.2012 08:48
Библиотека статистического языка R для .NET KOHCTAHTNH Помощь студентам 0 09.12.2011 16:40
написать программу статистического анализа текста moroshka Паскаль, Turbo Pascal, PascalABC.NET 2 08.01.2008 18:11