Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Новый топик    Ответить
 Организация структуры БД Oracle, Entity Framework  [new]
g_box
Member

Откуда: Спб
Сообщений: 54
Для работы с БД Oracle используетс Entity Framework (.NET 3.5) как лучше организовать структуру из расчета возможности EF?

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

Количество параметров от 1000 , частота импорта значения от 1сек. (ежечасно,сутки и т.д.)
Каким образом реализовать структуру БД для хранение данных и их выборки с точки зрения профессионалов?
Правильно ли использовать такую структуру ?

Таблица ПАРАМЕТР
[p_id, -идентификатор
p_name, -имя
imz_id, - идентификатор ед измерения
store_id - идентификатор хранилища(таблицы)
........]

Таблица ХРАНИЛИЩА
[store_id, - идетификатор
store_name, - имя
type_id - тип данных
period - переиод хранения
]

Таблица ТИПЫ
[type_id, - идетификатор
type_name, - имя
oracle_type - тип данных Oracle
]

Таблица ИЗМЕРЕНИЯ
[izm_id, - идетификатор
izm_name, - имя
]
на таблицу ХРАНИЛИЩА вешаю триггер где создаю доп. таблицу с заданной структурой и типом поля хранения

   exec_str:= 'CREATE TABLE Store_'||:NEW.store_id||' (p_id NUMBER NOT NULL, p_date date, p_val '||:NEW.oracle_type||' NOT NULL)';
   execute immediate exec_str;
так же удаляю триггером

Может есть путь легче?
Как выбирать данные из таблиц хранилищ? STORE_1......N c полем p_val разного типа при помощи VIEW? PROCEDURE? и привязать их сущностям для удобства програмимрования?

Спасибо! буду признателен за любую критику и помощь
14 янв 10, 08:37    [8180851]     Ответить | Цитировать Сообщить модератору
 Re: Организация структуры БД Oracle, Entity Framework  [new]
vinvin
Member

Откуда:
Сообщений: 81
Что то очень туманно с предметной областью. Не очень понятен смысл.
Ты хочешь хранить в таблицах какие-то метаданные?
Обычно это делается, когда в приложении необходимо динамически менять структуру (т.е. добавлять-удалять столбцы). В твоем случае я этого что-то не увидел (или не понял).

Есть один совет - не привязывайся к триггерам - это геморой почти обеспеченный. Пользуйся процедурами.
14 янв 10, 09:14    [8181019]     Ответить | Цитировать Сообщить модератору
 Re: Организация структуры БД Oracle, Entity Framework  [new]
Курочка Ряба
Member [заблокирован]

Откуда:
Сообщений: 229
g_box
Правильно ли использовать такую структуру?

Это вопрос не по Entity Framework.
Вам в форум Проектирование БД.

P.S. Когда будет готова структура, тогда можно обсуждать и ORM.
14 янв 10, 10:10    [8181378]     Ответить | Цитировать Сообщить модератору
 Re: Организация структуры БД Oracle, Entity Framework  [new]
g_box
Member

Откуда: Спб
Сообщений: 54
vinvin

Ты хочешь хранить в таблицах какие-то метаданные?


нет обычные данные например

Параметр: Расход воды мнгн, его значение 12,3 храняться в таблице STORE_1 в поле p_val(number)
Параметр: Расход воды сутки, его значение 12450,3 храняться в таблице STORE_2 в поле p_val(number)
Параметр: Установка Подогрева, его значение "В работе" храняться в таблице STORE_3 в поле p_val(varchar)

в итоге в таблице STORE_2 - все суточные значения типа number и период хранения например 25 лет
в итоге в таблице STORE_1 - все мнгновенные значения типа number и период хранения например 6 месяцев
и т.д.

Можно и процедуру смысл динамически создавать новые ХРАНИЛИЩА - таблицы STORE_N
14 янв 10, 10:12    [8181391]     Ответить | Цитировать Сообщить модератору
 Re: Организация структуры БД Oracle, Entity Framework  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 427
1. у нас есть параметры (много)
2. у нас есть ограниченное количество типов данных которые могут принимать параметры
строковые,
целые
плавающей точкой
дата и время

тогда может попробовать следующее:


Таблица ПараметрыСправочник
 ПараметрИД
 ПраметрИмя
 ПараметрТип


Таблица Измерения
 ИзмерениеИД
 Измерение...
 


Таблица ДанныеИзмеренийЦелое
 ИзмерениеИД
 Параметр
 Значение (Целое)


Таблица ДанныеИзмеренийСтрока
 ИзмерениеИД
 Параметр
 Значение (Строка)


Таблица ДанныеИзмеренийПлавТочка
 ИзмерениеИД
 Параметр
 Значение (ПлавТочка)


Таблица ДанныеИзмеренийДатаВремя
 ИзмерениеИД
 Параметр
 Значение (ДатаВремя)


Поставить триггер (ограничение) на то чтобы нельзя было вставлять
параметр с типом ПлавТочка в таблицу ДанныеИзмеренийЦелое к примеру.

Далее в программе расскидываете данные по таблицам.

Преимущество данной структуры в том что все ваши параметры типизированы
и в бд. храняться с явным указанием типа.

Возможно есть лучший вариант, подумайте.

--
PS
Не нужно генерировать таблицы в триггерах.
А то на этот ваш вопрос никто не ответит в последствии:
автор
Как выбирать данные из таблиц хранилищ? STORE_1......N c полем p_val разного типа при помощи VIEW? PROCEDURE? и привязать их сущностям для удобства програмимрования?
14 янв 10, 10:29    [8181518]     Ответить | Цитировать Сообщить модератору
 Re: Организация структуры БД Oracle, Entity Framework  [new]
g_box
Member

Откуда: Спб
Сообщений: 54
Курочка Ряба

P.S. Когда будет готова структура, тогда можно обсуждать и ORM.


Согласен я не архитектор БД, но программисты работая с Entity скорее всего постоянно сталкиваются с корявыми ручками проектировщиков БД, поэтому с начало вопрос задал здесь.

Вероятно нужно подойти с середины задачи и промоделировать какие необходимы сущности, как с ними программно работать и выбирать данные и после этого переложить на структуру таблиц БД?

К сожалению не нашел ни одного примера проекта показывающего реальное использование EF.
14 янв 10, 10:40    [8181609]     Ответить | Цитировать Сообщить модератору
 Re: Организация структуры БД Oracle, Entity Framework  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 427
g_box
[quot Курочка Ряба]
Вероятно нужно подойти с середины задачи и промоделировать какие необходимы сущности, как с ними программно работать и выбирать данные и после этого переложить на структуру таблиц БД?


Можно использовать и такой подход ef -> db, но ясно лишь одно entity framework не работает с динамическими объектами которые вы хотите генерить триггером (я про хранилища). После нового сгенеренного хранилища нужно обновить EF модель программисту.
14 янв 10, 10:50    [8181699]     Ответить | Цитировать Сообщить модератору
 Re: Организация структуры БД Oracle, Entity Framework  [new]
Курочка Ряба
Member [заблокирован]

Откуда:
Сообщений: 229
g_box
программисты работая с Entity скорее всего постоянно сталкиваются с корявыми ручками проектировщиков БД

Ну так проблему нужно решать с корня, а не наоборот. Сделайте нормальную схему, удовлетворяющую хотя бы 3 НФ, а потом в бой в Entity.

g_box
Вероятно нужно подойти с середины задачи и промоделировать какие необходимы сущности, как с ними программно работать и выбирать данные и после этого переложить на структуру таблиц БД?

С середины не надо, надо с самого начала - спланируйте нормальную схему в БД :)

g_box
К сожалению не нашел ни одного примера проекта показывающего реальное использование EF.

Я Вам покажу, только сначала организуйте схему. А маппить, простите, гавно на лопате на генеренные классы - это уже будет не проект, а свалка мусора.
14 янв 10, 10:51    [8181715]     Ответить | Цитировать Сообщить модератору
 Re: Организация структуры БД Oracle, Entity Framework  [new]
Курочка Ряба
Member [заблокирован]

Откуда:
Сообщений: 229
Сначала давайте решать вопрос с триггерами: какую задачу решают триггеры у Вас?
Если есть возможность избежать ту или иную хп, лучше это сделать.

P.S. Под оракл я, всё-таки, посоветовал бы проверенное решение: NHibernate.
14 янв 10, 10:54    [8181743]     Ответить | Цитировать Сообщить модератору
 Re: Организация структуры БД Oracle, Entity Framework  [new]
g_box
Member

Откуда: Спб
Сообщений: 54
Владимир Затуливетер

Таблица ДанныеИзмеренийПлавТочка
 ИзмерениеИД
 Параметр
 Значение (ПлавТочка)


Спасибо за ответ, этот способ тоже рассматривается, а каким образом решить задачу :

значения 150-ти параметров с плавающей точкой нужно хранить 6 месяцев
значения 1500-т параметров с плавающей точкой нужно хранить неделю
значения 500-т параметров с плавающей точкой нужно хранить 25 лет

при чем 1500 параметров которые нужно хранить неделю являются оперативными и вносяться в БД с частотой раз в 30 сек, и при этом данные выбираются для различных UI и отчетов? а таблица одна
14 янв 10, 10:58    [8181793]     Ответить | Цитировать Сообщить модератору
 Re: Организация структуры БД Oracle, Entity Framework  [new]
g_box
Member

Откуда: Спб
Сообщений: 54
Курочка Ряба
Сначала давайте решать вопрос с триггерами: какую задачу решают триггеры у Вас?
Если есть возможность избежать ту или иную хп, лучше это сделать.

P.S. Под оракл я, всё-таки, посоветовал бы проверенное решение: NHibernate.


Триггер создает новую таблицу хранилища STORE_N для хранения значений определенно типа и определенной переодичности, как Вы сказали новую сущность которую необходимо обновить программно что геморой

может использовать процедуры и view для работы с данными таблицами в нутри oracle и создания одной абстрактной сущности например VALUE (p_val,p_date)+ по p_id связать с параметрами? или я намудрил :(

за совет спасибо, обязательно сравню.
14 янв 10, 11:17    [8181955]     Ответить | Цитировать Сообщить модератору
 Re: Организация структуры БД Oracle, Entity Framework  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 427
Таблица ПараметрыСправочник
 ПараметрИД
 ПраметрИмя
 ПараметрТип
 ХранитьСтолькоВремени (тут указывается для каждого параметра сколько его хранить, для всех типов в том числе и для плав точки)

автор
при чем 1500 параметров которые нужно хранить неделю являются оперативными и вносяться в БД с частотой раз в 30 сек, и при этом данные выбираются для различных UI и отчетов? а таблица одна


Вы боитесь блокировок на таблицу, т.е. различные приложения будут бороться за доступ к ней?
Но это легко решается с установкой необходимого уровня излоляции транзакции.

в ms sql server например есть уровень изоляции снепшот set transaction isolation level snapshot
позволяет считывать данные из таблицы даже во время их вставки, т.е. совершенно не блокируя таблицы.
14 янв 10, 11:32    [8182117]     Ответить | Цитировать Сообщить модератору
 Re: Организация структуры БД Oracle, Entity Framework  [new]
g_box
Member

Откуда: Спб
Сообщений: 54
Владимир Затуливетер

Вы боитесь блокировок на таблицу, т.е. различные приложения будут бороться за доступ к ней?


Вы правы это настраивается, есть опасение разрастания таблицы через 2-3-4 года не хотелось бы иметь несколько миллионов записей
14 янв 10, 11:49    [8182337]     Ответить | Цитировать Сообщить модератору
 Re: Организация структуры БД Oracle, Entity Framework  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 427
g_box
Владимир Затуливетер

Вы боитесь блокировок на таблицу, т.е. различные приложения будут бороться за доступ к ней?


Вы правы это настраивается, есть опасение разрастания таблицы через 2-3-4 года не хотелось бы иметь несколько миллионов записей


Вы на форум оракла это напишите, уверен что на вас обрушится куча людей.
Таблицы могут хранить очень большое количество строк сотни милионов, милиарды.
Для доступа к необходимым данным вы используете выборки.
Выборки с определенными фильтрами, к примеру по датам за последнюю неделю.
Далее в ход идут ИНДЕКСЫ которые вы не забыли создать в своей БД.
За чет них выбираются только нужные данные, только те 10000 записей которые необходимы.
Игнорируя и даже не обращаясь к остальным 10 милионам.


Если вы не полагаетесь на механизмы СУБД то можете реализовать архивные таблицы,
т.е. каждая из таблиц у вас разделяется на 2, архив и текущие данные и время от времени
не нужные данные перебрасываются в архив.
14 янв 10, 12:03    [8182499]     Ответить | Цитировать Сообщить модератору
 Re: Организация структуры БД Oracle, Entity Framework  [new]
g_box
Member

Откуда: Спб
Сообщений: 54
Владимир Затуливетер

Вы на форум оракла это напишите, уверен что на вас обрушится куча людей.
Таблицы могут хранить очень большое количество строк сотни милионов, милиарды.
Для доступа к необходимым данным вы используете выборки.
Выборки с определенными фильтрами, к примеру по датам за последнюю неделю.
Далее в ход идут ИНДЕКСЫ которые вы не забыли создать в своей БД.
За чет них выбираются только нужные данные, только те 10000 записей которые необходимы.
Игнорируя и даже не обращаясь к остальным 10 милионам.

Если вы не полагаетесь на механизмы СУБД то можете реализовать архивные таблицы,
т.е. каждая из таблиц у вас разделяется на 2, архив и текущие данные и время от времени
не нужные данные перебрасываются в архив.


Согласен, но даже серьезные тех. ситему не используют одну таблицу к примеру три таблицы
1-я таблица все данные (допустим 1раз в минуту) - храняться месяц
2-я таблица все данные - усредняются из первой за 10 минут
3-я таблица усредняются за час - при чем после усреднений данные из источников удаляются соответственно

Хорошо спасибо Я Вас понял в данном случае действительно нужно создать сперва БД хотя бы 3НФ без динамического создания таблиц, а затем использовать EF.
14 янв 10, 12:31    [8182795]     Ответить | Цитировать Сообщить модератору
 Re: Организация структуры БД Oracle, Entity Framework  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 427
Вы про усреднение ранее не говорили, замечу.

Это таже история что с архивированием,
только у вас больше таблиц,
причем каждая последующая содержит более сжатые данные.

Для некоторых систем это не подходит, всегда нужны оригинальные (не сжатые данные).

При таком подходе "сжатия данных" вам потребуется время на обработку.
Т.е для переброски данных в архивные таблицы нужны ресурсы, и время, это нужно учесть при проектировании.

Можно создать в своей БД несколько таблиц.
К примеру вариант такой, всегда оставлять первоначальные данные в таблице
И на основе ее заполнять таблицы сжатых данных
10 мин, 1 час, 24 часа... и тд.
Благодаря этому вы всегда можете получить доступ к первоначальным данным, кото знает может скоро они вам понадобятся.

Можно рассмотреть варианты с OLAP.

К той структуре которую я вам предлагал ранее с 6 таблицами

Таблица ПараметрыСправочник
Таблица Измерения
Таблица ДанныеИзмеренийЦелое
Таблица ДанныеИзмеренийСтрока
Таблица ДанныеИзмеренийПлавТочка
Таблица ДанныеИзмеренийДатаВремя

добавляются еще таблицы:

Таблица ДанныеИзмеренийЦелоеСжатые10мин
Таблица ДанныеИзмеренийСтрокаСжатые10мин
Таблица ДанныеИзмеренийПлавТочкаСжатые10мин
Таблица ДанныеИзмеренийДатаВремяСжатые10мин

Таблица ДанныеИзмеренийЦелоеСжатые60мин
Таблица ДанныеИзмеренийСтрокаСжатые60мин
Таблица ДанныеИзмеренийПлавТочкаСжатые60мин
Таблица ДанныеИзмеренийДатаВремяСжатые60мин

Таблица ДанныеИзмеренийЦелоеСжатые24часа
Таблица ДанныеИзмеренийСтрокаСжатые24часа
Таблица ДанныеИзмеренийПлавТочкаСжатые24часа
Таблица ДанныеИзмеренийДатаВремяСжатые24часа

и т.д...

Если необходимо предусмотреть связь сжатых данных с несжатыми.

Вариантов тут куча, главное таблиц не генерить динамических.
Не создавать изначально проблем, чтоб героически их потом решать ;)
14 янв 10, 13:59    [8183781]     Ответить | Цитировать Сообщить модератору
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Ответить