powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Хранение произвольного кол-ва параметров
25 сообщений из 34, страница 1 из 2
Хранение произвольного кол-ва параметров
    #32155107
spa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
spa
Гость
Здравствуйте , товарищи. Помогите с такой проблемой. Нужна система, позволяющая отслеживать строительство промышленных объектов так чтобы ежедневно заноситm состояние этих объектов в БД. При этом нужно обеспечить структурированную регистрацию произвольного кол-ва параметров этих самых объектов. Получается что жестко задать структуру таблиц , хранящих данные нельзя. Как быть? Если у кого есть подобный опыт, поделитесь пожалуйста.
...
Рейтинг: 0 / 0
Хранение произвольного кол-ва параметров
    #32155167
Репликант
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможны варианты:

а) Использование чисто реляционной СУБД (типа MSSQL, MySQL, Access)
Вопрос создания модели решается самым сложным образом - созданием промежуточного "слоя" из метаобъектов. Ссылки по этой теме:
* Реляционная БД как хранилище объектов (известная статья Тенцера)
* Пример создания картографической БД (также ссылки на др.ресурсы)
б) Использование истинно объектной СУБД (типа Cache' и т.д), удовлетворяющей стандарту ODMG.
Вопрос создания модели и программирования решается естественно просто на стороне СУБД, если вы знакомы с ОО-подходом и программированием
б) Использование реляционно-объектной СУБД (типа UDB, Oracle, Postgres и т.д)
Вопрос создания модели решается несколько сложнее, чем в случае б) и легче чем, в а) поскольку на стороне СУБД можно создавать произвольные структуры-объекты и функции работы с ними, но не сами методы объектов
...
Рейтинг: 0 / 0
Хранение произвольного кол-ва параметров
    #32155178
rmn_itam
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На уровне типа промышленного объекта можно создать таблицу, содержащую названия необходимых параметров и их возможные значения если это нужно. То есть эта таблица может содержать 3 поля: ключ типа объекта, названние параметра и одну или несколько колонок с возможными значениями. Создав такое описание, при создании нового реального объекта создаешь специальную таблицу, которая и содержит нужные тебе описания. Что то по моему немного мутно объяснил. Но суть состоит в следующем. По моему ты пытаешься ориентироваться на такую структуру таблицы, в которой параметр это колонка. А нужно наоборот. Названия параметров и их значения хранить в строках. Тогда нет никаких проблем с колличеством и инзменением структуры таблицы под каждый случай.
...
Рейтинг: 0 / 0
Хранение произвольного кол-ва параметров
    #32155680
spa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
spa
Гость
Спасибо ответившим. По ссылкам погуляю.
Хранение какждого параметра в отдельной строке - хорошая идея и возможно единственная, которая дает то , что мне нужно в обычной (не объектной ) БД, но при этом терзают смутные сомнения что это будет укладываться в законы построения реляционных БД. Имея набор параметров в столбцах все просто ,быстро и изящно, но жестко. А засунув параметры в строки можно умереть на последующей обработке информации (ИМХО).Есть ли у кого такой опыт?
...
Рейтинг: 0 / 0
Хранение произвольного кол-ва параметров
    #32155717
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
spa писал:... засунув параметры в строки можно умереть на последующей обработке информации ...
Не переживай - все нормально. Именно так и делается. Небольшие трудности с разработкой интерфейса - и ничего более. Учет материальных ценностей - у каждой категории свои характеристики. У меня работает.
...
Рейтинг: 0 / 0
Хранение произвольного кол-ва параметров
    #32155980
Фотография wara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если все параметры попадают в один столбец, то они хранятся как данные одного типа. Как решается эта проблема?
...
Рейтинг: 0 / 0
Хранение произвольного кол-ва параметров
    #32156029
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скорее всего решение будет DBMS-специфично, точнее, его можно сделать таковым. К примеру, в Oracle можно попробовать поработать с типом ANYDATA:
http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96540/sql_elements2a.htm#54882
http://download-west.oracle.com/docs/cd/B10501_01/appdev.920/a96590/adfnstyp.htm#434671

Тенцер предлагает описать несколько таблиц с различными типами хранимых атрибутов- это одно из общих решений.
...
Рейтинг: 0 / 0
Хранение произвольного кол-ва параметров
    #32156036
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
Я использую VARCHAR2.
...
Рейтинг: 0 / 0
Хранение произвольного кол-ва параметров
    #32156083
Фотография wara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я вот тут как-то случайно вышел на контору, которая, как я понял, так проектирует структуру, что вновь появившиеся после запуска базы в эксплуатацию аттрибуты легко "ложатся" в их оптимизированную структуру без добавления новых таблиц, полей.., то есть без изменения базы. Правда, нет времени все это изучить, если что новое узнаете - черкните сюда пару строк... А адрес такой - http://www.sterling.ru/software/ . Там есть описания, по-моему, можно догадаться, как там это у них сделано...
...
Рейтинг: 0 / 0
Хранение произвольного кол-ва параметров
    #32156543
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот еще достаточно проработанно
http://www.stikriz.narod.ru/
...
Рейтинг: 0 / 0
Хранение произвольного кол-ва параметров
    #32160118
spa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
spa
Гость
Предполагаю что буду использовать вариант с хранением всех данных как строковых. Всем большое спасибо за ответы !
spa
...
Рейтинг: 0 / 0
Хранение произвольного кол-ва параметров
    #32162561
Репликант
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 spa:
Хранение какждого параметра в отдельной строке - хорошая идея и возможно единственная, которая дает то , что мне нужно в обычной (не объектной ) БД, но при этом терзают смутные сомнения что это будет укладываться в законы построения реляционных БД. Имея набор параметров в столбцах все просто ,быстро и изящно, но жестко.

Да, но такой промежуточный вариант ("урезанный" Тенцер) - с хранением объектов, числовых/строковых параметров в виде отдельных сущностей и связей между конкретными объектами и параметрами, тоже не без недостатков. Например, как обеспечить корректность значений т.к ограничения типа check нельзя использовать

А засунув параметры в строки можно умереть на последующей обработке информации (ИМХО).Есть ли у кого такой опыт?
...
Предполагаю что буду использовать вариант с хранением всех данных как строковых. Всем большое спасибо за ответы !


При таком подходе ограничения и разные "геморрои" прослеживаются даже теоретически:

=> Реляционная модель с ее естетсвенными ограничениями целостности работает
только частично, например, придется как-то гарантировать уникальность значения в строке с разделителем/определителем.
=> Надо писать функции по работе со строками с разделителем/определителем, например, поиск
в строке значения конкретного параметра
...
Рейтинг: 0 / 0
Хранение произвольного кол-ва параметров
    #32237300
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если будешь использовать "обычные" СУБД, то в этом случае можно наплодить таблиц-аттрибутов, т.е. под каждый аттрибут или связанную группу аттрибутов создать ОТДЕЛЬНУЮ таблицу (пусть их даже будет сотни этих таблиц аттрибутов), со связью 1<-1 с главной.
При таком построении можно пользоваться всеми прелестями реляционной базы, напр. check на уровне строки и всевозможные constrains на уровне базы + индексы + возможность строить "осмысленные" запросы и т.д. и т.п. Так же правомерно в этом случае будет использование триггеров, привязанных к вполне "осмысленным" полям и таблицам.

При желании можно немного постараться и реализовать управление этими таблицами из программы (т.е. если надо - позволить программе создавать и описывать новые простые или составные аттрибуты, которые будут затем храниться в "собственных" таблицах)

Будет немного труда в начале разработки, но это сполна окупится.
...
Рейтинг: 0 / 0
Хранение произвольного кол-ва параметров
    #32237301
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сорри, вовремя это я...
на число не посмотрел...
...
Рейтинг: 0 / 0
Хранение произвольного кол-ва параметров
    #32237367
Jinn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vdimas

Если будешь использовать "обычные" СУБД, то в этом случае можно наплодить таблиц-аттрибутов, т.е. под каждый аттрибут или связанную группу аттрибутов создать ОТДЕЛЬНУЮ таблицу (пусть их даже будет сотни этих таблиц аттрибутов), со связью 1<-1 с главной.

В "обычных", то есть реляционных СУБД - это можно назвать недочетом проектирования (если не ошибкой). С появлением нового объекта необходимо добавлять в схему новую таблицу атрибутов, в клиенте делать новое окно отображения и т.п. rmn_itam дал верный совет (см. его пост) Еще можно посоветовать сделать привязку атрибутов к объекту и на этой основе делать динамические запросы в клиенте, для того чтобы получить сводную таблицу значений по однотипным объектам.
...
Рейтинг: 0 / 0
Хранение произвольного кол-ва параметров
    #32237538
Дмитрий Мыльников
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во-первых, я не думаю, что там все параметры произвольные. Всё равно есть какая-то часть, которая имеется у всех объектов. Вот их нужно выделить и хранить в обычных таблицах. А для остальных использвать метод метатаблиц, как тут предлагалось (ID,TypeParam,NameParam,VarStr,VarInt,VarDouble,VarMemo,...).
Если есть возможность, то можно всё хранить в текстовом виде как строки, тогда структура упрощается. Существуют ещё варинаты, когда разные типы хранятся каждый в своей таблице (чтобы место сэкономить). Но с точки зрения обработки это получается очень сложно.

И ещё, для данной задачи я Вам весьма рекомендую сделать не просто список параметров, а ещё и разделы, где эти параметры сгрупированны. Плюс, что-то типа справочника параметров, из которого оператор будет их добавлять в конкретные объекты. Там, естетсвенно, та же система разделов, по которым эти параметры сгрупированы. В справочнике мы храним тип, наименование и значение по умолчанию. Возможно, что ещё и допустимый диапазон значений для данного параметра. Я бы ещё сделал к справочнику третью таблицу (кроме разделов и самих параметров), где бы при необходимости можно было хранить список допустимых или наиболее часто используемых значений, которые пользователь потом сможет выбирать с помощью ComboBox'а. Насколько я знаю эту предметную область (строительство), то там это встречается очень часто. Те же материалы конструкций или диаметры труб, марка бетона, цемента, металла и т.п. Причём тут, опять же, в большинстве случаев достаочно ограничется обычным текстовым представлением.
...
Рейтинг: 0 / 0
Хранение произвольного кол-ва параметров
    #32238123
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Jinn
В "обычных", то есть реляционных СУБД - это можно назвать недочетом проектирования (если не ошибкой).

С этим распространенным мнением хорошо знаком, т.к. сам несколько лет назад его придерживался. Считается, что плодить таблицы - излишество. Однако взгляни еще раз, для чего именно это предлагается (checks, индексы, ограничения целостности на уровне базы). И еще немаловажный вопрос по быстродействию! Когда данные храняться в "своих" таблицах, а не свалены в "кучу" в общих таблицах аттрибутов, все работает гораздо быстрее.

И ничуть не сложнее написать "create table", чем "select". Так что, при грамотном подходе проблем не будет.

А кто-нить может объяснить внятно, почему плодить таблицы считается ошибкой???
В ООП, например, тысячи классов/объектов - дело нормальное. А если в БД тысячи таблиц - "ошибка проектирования"... И то и другое есть проекция/моделирование сущностей решаемой задачи на конкретные цифровые представления.
Вполне понятно желание "скомпоновать" похожие по типу (но не по СМЫСЛУ) данные в "групповых" таблицах, в страхе заблудиться в собственном проекте. Так кто же просит это "вручную" делать. Сначала делаем некий "движок", которому как раз и доверяем автоматизацию этого процесса. Организуем наши сущности в виде иерархических справочников (как Дмитрий Мыльников предложил) в целях удобства навигации, и ... Не так страшен черт, как его малюют - со сложностью можно бороться.
...
Рейтинг: 0 / 0
Хранение произвольного кол-ва параметров
    #32238129
c127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vdimas> И еще немаловажный вопрос по быстродействию! Когда данные храняться в "своих" таблицах, а не свалены в "кучу" в общих таблицах аттрибутов, все работает гораздо быстрее.

Так индексировать нужно, и все будет OK. Куча-то совсем небольшая.
Плюс при такой схеме запросы получаются динамические, что очень плохо для того же быстродействия. Их можно сделать статическими, но сложно. К примеру при OLTP от динамических запросов сервер просто умрет.

vdimas> А кто-нить может объяснить внятно, почему плодить таблицы считается ошибкой???

Само по себе много таблиц не есть формальная ошибка. Но если на каждый новый атрибут пользователь будет строить таблицу, то ему нужно выдать привелегию на create/drop database object. Такой пользователь потенциально может сильно испортить настроение DBA. Плюс пользователю нужно выдать привелегию на лазание по системным таблицам, тоже не очень хорошо.
...
Рейтинг: 0 / 0
Хранение произвольного кол-ва параметров
    #32238137
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Само по себе много таблиц не есть формальная ошибка. Но если на каждый новый атрибут пользователь будет строить таблицу, то ему нужно выдать привелегию на create/drop database object. Такой пользователь потенциально может сильно испортить настроение DBA. Плюс пользователю нужно выдать привелегию на лазание по системным таблицам, тоже не очень хорошо.

А как насчет инкапсуляции этих моментов в процедуры?
...
Рейтинг: 0 / 0
Хранение произвольного кол-ва параметров
    #32238152
Дмитрий Мыльников
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я думаю, что тут есть ещё один момент. На самом деле количетсво параметров не такое уж "любое" и бесконечное. Я немного эту предметную область знаю, там действительно параметров много, СНиП'ов всяких полно. Но при всём при этом там тоже есть своя внутренняя структура с конечным числом объектов и их свойств.

То есть, есть ещё варнат, когда мы делаем не просто справочник параметров, а "хранилище" этих параметров. То есть, таблица создаётся не для каждого объекта, а когда новый параметр добавляется в справочник.

Но на самом деле нужно делать прототип и тестирвоать на удобство и быстродействие. Мне приходилось видеть системы с метатаблицами, где к примерно 30 тыс. базовых записей генерилось почти 500 тыс. записей в таблицах параметров. При этом система становилась ну очень сильно тормозной, хотя там что-то такое пытались оптимизировать и практически все операции выполнялись хранимыми процедурами на сервере.

Что касается "много таблиц - плохо", то это связано с той же экономией ресурсов. Когда то это были ограничения на количество одновременно открытых файлов, сейчас попытка сэкономить ресурсы сервера. Ведь сервре, как я понимаю, для каждой используемой таблицы будет собственный объект заводить с буферами, таблицей прав пользователей и т.п.
...
Рейтинг: 0 / 0
Хранение произвольного кол-ва параметров
    #32238174
Jinn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vdimas
2 Jinn
В "обычных", то есть реляционных СУБД - это можно назвать недочетом проектирования (если не ошибкой).

С этим распространенным мнением хорошо знаком, т.к. сам несколько лет назад его придерживался. Считается, что плодить таблицы - излишество. Однако взгляни еще раз, для чего именно это предлагается (checks, индексы, ограничения целостности на уровне базы). И еще немаловажный вопрос по быстродействию! Когда данные храняться в "своих" таблицах, а не свалены в "кучу" в общих таблицах аттрибутов, все работает гораздо быстрее.

Ты несколько заблуждаешься. Не "плодить таблицы" а создавать для каждого нового объекта свою таблицу параметров. При таком подходе разработчик должен каждый раз, при появлении нового объекта, создавать новую таблицу параметров. При некоторой удаленности разработчика от заказчика это займет определенное время, что выльется в простой. Да и заказчик за такое удовольствие должен будет платить (поддержка). Заказчику это надо?

Теперь о быстродействии. При грамотной индексации и шустром сервере быстродействие будет на уровне RT. На wintel с одним пнем это примерно до 10000 параметров и до 500000 их значений.

Ну и до кучи про "кучу" :) В системе можно предусмотреть динамическое создание VIEWS, который разворачивет характеристики объектов в плоскую таблицу, для каждого типа объекта по набору привязанных параметров. Таким образом мы получаем тот же набор таблиц.
...
Рейтинг: 0 / 0
Хранение произвольного кол-ва параметров
    #32238305
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Jinn

Уже второй голос утверждает, что можно и некоторого быстродействия достичь на определенном количестве записей - кто же спорит?

Только никто еще не высказался по поводу того, а что же делать с checks и constrains? А насчет "ручного" создания - повторюсь, этот процесс можно и нужно автоматизировать, тогда необходимость держать разработчика "на привязи" отпадет сама собой. Мое предложение подразумевает автоматизацию процесса создания таблицы аттрибуттов как основу идеи. 1C не боиться при добавлении полей менять структуры таблиц, а мы что - пальцем деланные?
...
Рейтинг: 0 / 0
Хранение произвольного кол-ва параметров
    #32238333
c127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vdimas> А как насчет инкапсуляции этих моментов в процедуры?

Конечно можно спрятать в процедуры. Но во-первых динамический SQL все равно остается по крайней мере для создания таблицы, во-вторых нужно очень внимательно продумывать систему, чтоб не позволить пользователью удалить чужую таблицу по ошибке, даже из процедуры. Разработчик ведь тоже от ошибок не застрахован. К тому же создание/удаление таблицы гораздо более медленный процесс, чем добавление/удаление нескольких записей в несколько таблиц, пусть даже это и относительно редкое явление.

vdimas> Только никто еще не высказался по поводу того, а что же делать с checks и constrains.

Автоматическое поддержание целостности SQL сервером безусловно достоинство предлагаемого решения. Но за него нужно платить теми процедурами, в которые прячутся от пользователя создание/удаление таблиц. Т.е. имеет место выбор: либо с констрейнами бороться с помощью триггеров, либо с таблицами с помощью процедур. Так по-моему проще и безопаснее с констрейнами бороться. Ведь удаление таблицы по ошибке (а ведь это можеть быть таблица customers) гораздо хуже, чем мусор в дочерней таблице, оставшийся по ошибке после удаления записи в родительской таблице.
...
Рейтинг: 0 / 0
Хранение произвольного кол-ва параметров
    #32238340
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 c127

Дык, ведь без ума креститься - только нагрешить! Зачем предоставлять возможность удалить таблицу Customers?
В интерфейсе готового программного продукта должны присутствовать средства по управлению аттрибутами. Пользователь и знать не должен, что в ответ на его действия могут создаваться , изменяться или удаляться таблицы. Опять же (не перебивать! :)) ), если в неких таблицах атрибутов есть записи, то пользователь просто не имеет права удялять такие таблицы. Сложная логика? Фонарь...
...
Рейтинг: 0 / 0
Хранение произвольного кол-ва параметров
    #32238418
Jinn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 vdimas

Check и Constrains нужно использовать только тогда, когда это очень критично. Как и внешнии ключи. Все это тормозит работу сервера БД. Лучше, по возможности, обходится без них. В данном случае достаточно будет внешнего ключа с конструкцией delete cascade, для удаления зависимых записей. Если нужно ограничить значение параметра, то строится еще одна или две таблицы, где указаны допустимые значения атрибутовов с привязкой как к атрибуту, так и к типу объекта. И никаких чеков. Ввод данных - через ХП.
А вот как ты будешь искать в сотне таблиц объект по значению атрибута, при условии что наименование атрибута и объекта нам неизвестны? Даже сам запрос составить уйдет много времени, не говоря уже о времени поиска. Думать нужно не только о том как хранить, но и о том как добыть. В случае хранения значений атрибутов эта проблема решается "на раз" :)
...
Рейтинг: 0 / 0
25 сообщений из 34, страница 1 из 2
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Хранение произвольного кол-ва параметров
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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