|
Хранение произвольного кол-ва параметров
|
|||
---|---|---|---|
#18+
Здравствуйте , товарищи. Помогите с такой проблемой. Нужна система, позволяющая отслеживать строительство промышленных объектов так чтобы ежедневно заноситm состояние этих объектов в БД. При этом нужно обеспечить структурированную регистрацию произвольного кол-ва параметров этих самых объектов. Получается что жестко задать структуру таблиц , хранящих данные нельзя. Как быть? Если у кого есть подобный опыт, поделитесь пожалуйста. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2003, 13:02 |
|
Хранение произвольного кол-ва параметров
|
|||
---|---|---|---|
#18+
Возможны варианты: а) Использование чисто реляционной СУБД (типа MSSQL, MySQL, Access) Вопрос создания модели решается самым сложным образом - созданием промежуточного "слоя" из метаобъектов. Ссылки по этой теме: * Реляционная БД как хранилище объектов (известная статья Тенцера) * Пример создания картографической БД (также ссылки на др.ресурсы) б) Использование истинно объектной СУБД (типа Cache' и т.д), удовлетворяющей стандарту ODMG. Вопрос создания модели и программирования решается естественно просто на стороне СУБД, если вы знакомы с ОО-подходом и программированием б) Использование реляционно-объектной СУБД (типа UDB, Oracle, Postgres и т.д) Вопрос создания модели решается несколько сложнее, чем в случае б) и легче чем, в а) поскольку на стороне СУБД можно создавать произвольные структуры-объекты и функции работы с ними, но не сами методы объектов ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2003, 14:13 |
|
Хранение произвольного кол-ва параметров
|
|||
---|---|---|---|
#18+
На уровне типа промышленного объекта можно создать таблицу, содержащую названия необходимых параметров и их возможные значения если это нужно. То есть эта таблица может содержать 3 поля: ключ типа объекта, названние параметра и одну или несколько колонок с возможными значениями. Создав такое описание, при создании нового реального объекта создаешь специальную таблицу, которая и содержит нужные тебе описания. Что то по моему немного мутно объяснил. Но суть состоит в следующем. По моему ты пытаешься ориентироваться на такую структуру таблицы, в которой параметр это колонка. А нужно наоборот. Названия параметров и их значения хранить в строках. Тогда нет никаких проблем с колличеством и инзменением структуры таблицы под каждый случай. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2003, 14:25 |
|
Хранение произвольного кол-ва параметров
|
|||
---|---|---|---|
#18+
Спасибо ответившим. По ссылкам погуляю. Хранение какждого параметра в отдельной строке - хорошая идея и возможно единственная, которая дает то , что мне нужно в обычной (не объектной ) БД, но при этом терзают смутные сомнения что это будет укладываться в законы построения реляционных БД. Имея набор параметров в столбцах все просто ,быстро и изящно, но жестко. А засунув параметры в строки можно умереть на последующей обработке информации (ИМХО).Есть ли у кого такой опыт? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2003, 09:17 |
|
Хранение произвольного кол-ва параметров
|
|||
---|---|---|---|
#18+
spa писал:... засунув параметры в строки можно умереть на последующей обработке информации ... Не переживай - все нормально. Именно так и делается. Небольшие трудности с разработкой интерфейса - и ничего более. Учет материальных ценностей - у каждой категории свои характеристики. У меня работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2003, 09:44 |
|
Хранение произвольного кол-ва параметров
|
|||
---|---|---|---|
#18+
Если все параметры попадают в один столбец, то они хранятся как данные одного типа. Как решается эта проблема? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2003, 12:38 |
|
Хранение произвольного кол-ва параметров
|
|||
---|---|---|---|
#18+
Скорее всего решение будет 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 Тенцер предлагает описать несколько таблиц с различными типами хранимых атрибутов- это одно из общих решений. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2003, 13:07 |
|
Хранение произвольного кол-ва параметров
|
|||
---|---|---|---|
#18+
Я использую VARCHAR2. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2003, 13:11 |
|
Хранение произвольного кол-ва параметров
|
|||
---|---|---|---|
#18+
Я вот тут как-то случайно вышел на контору, которая, как я понял, так проектирует структуру, что вновь появившиеся после запуска базы в эксплуатацию аттрибуты легко "ложатся" в их оптимизированную структуру без добавления новых таблиц, полей.., то есть без изменения базы. Правда, нет времени все это изучить, если что новое узнаете - черкните сюда пару строк... А адрес такой - http://www.sterling.ru/software/ . Там есть описания, по-моему, можно догадаться, как там это у них сделано... ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2003, 13:31 |
|
Хранение произвольного кол-ва параметров
|
|||
---|---|---|---|
#18+
вот еще достаточно проработанно http://www.stikriz.narod.ru/ ... |
|||
:
Нравится:
Не нравится:
|
|||
09.05.2003, 03:26 |
|
Хранение произвольного кол-ва параметров
|
|||
---|---|---|---|
#18+
Предполагаю что буду использовать вариант с хранением всех данных как строковых. Всем большое спасибо за ответы ! spa ... |
|||
:
Нравится:
Не нравится:
|
|||
15.05.2003, 07:55 |
|
Хранение произвольного кол-ва параметров
|
|||
---|---|---|---|
#18+
2 spa: Хранение какждого параметра в отдельной строке - хорошая идея и возможно единственная, которая дает то , что мне нужно в обычной (не объектной ) БД, но при этом терзают смутные сомнения что это будет укладываться в законы построения реляционных БД. Имея набор параметров в столбцах все просто ,быстро и изящно, но жестко. Да, но такой промежуточный вариант ("урезанный" Тенцер) - с хранением объектов, числовых/строковых параметров в виде отдельных сущностей и связей между конкретными объектами и параметрами, тоже не без недостатков. Например, как обеспечить корректность значений т.к ограничения типа check нельзя использовать А засунув параметры в строки можно умереть на последующей обработке информации (ИМХО).Есть ли у кого такой опыт? ... Предполагаю что буду использовать вариант с хранением всех данных как строковых. Всем большое спасибо за ответы ! При таком подходе ограничения и разные "геморрои" прослеживаются даже теоретически: => Реляционная модель с ее естетсвенными ограничениями целостности работает только частично, например, придется как-то гарантировать уникальность значения в строке с разделителем/определителем. => Надо писать функции по работе со строками с разделителем/определителем, например, поиск в строке значения конкретного параметра ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2003, 23:07 |
|
Хранение произвольного кол-ва параметров
|
|||
---|---|---|---|
#18+
Если будешь использовать "обычные" СУБД, то в этом случае можно наплодить таблиц-аттрибутов, т.е. под каждый аттрибут или связанную группу аттрибутов создать ОТДЕЛЬНУЮ таблицу (пусть их даже будет сотни этих таблиц аттрибутов), со связью 1<-1 с главной. При таком построении можно пользоваться всеми прелестями реляционной базы, напр. check на уровне строки и всевозможные constrains на уровне базы + индексы + возможность строить "осмысленные" запросы и т.д. и т.п. Так же правомерно в этом случае будет использование триггеров, привязанных к вполне "осмысленным" полям и таблицам. При желании можно немного постараться и реализовать управление этими таблицами из программы (т.е. если надо - позволить программе создавать и описывать новые простые или составные аттрибуты, которые будут затем храниться в "собственных" таблицах) Будет немного труда в начале разработки, но это сполна окупится. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2003, 03:48 |
|
Хранение произвольного кол-ва параметров
|
|||
---|---|---|---|
#18+
сорри, вовремя это я... на число не посмотрел... ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2003, 03:50 |
|
Хранение произвольного кол-ва параметров
|
|||
---|---|---|---|
#18+
vdimas Если будешь использовать "обычные" СУБД, то в этом случае можно наплодить таблиц-аттрибутов, т.е. под каждый аттрибут или связанную группу аттрибутов создать ОТДЕЛЬНУЮ таблицу (пусть их даже будет сотни этих таблиц аттрибутов), со связью 1<-1 с главной. В "обычных", то есть реляционных СУБД - это можно назвать недочетом проектирования (если не ошибкой). С появлением нового объекта необходимо добавлять в схему новую таблицу атрибутов, в клиенте делать новое окно отображения и т.п. rmn_itam дал верный совет (см. его пост) Еще можно посоветовать сделать привязку атрибутов к объекту и на этой основе делать динамические запросы в клиенте, для того чтобы получить сводную таблицу значений по однотипным объектам. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2003, 10:56 |
|
Хранение произвольного кол-ва параметров
|
|||
---|---|---|---|
#18+
Во-первых, я не думаю, что там все параметры произвольные. Всё равно есть какая-то часть, которая имеется у всех объектов. Вот их нужно выделить и хранить в обычных таблицах. А для остальных использвать метод метатаблиц, как тут предлагалось (ID,TypeParam,NameParam,VarStr,VarInt,VarDouble,VarMemo,...). Если есть возможность, то можно всё хранить в текстовом виде как строки, тогда структура упрощается. Существуют ещё варинаты, когда разные типы хранятся каждый в своей таблице (чтобы место сэкономить). Но с точки зрения обработки это получается очень сложно. И ещё, для данной задачи я Вам весьма рекомендую сделать не просто список параметров, а ещё и разделы, где эти параметры сгрупированны. Плюс, что-то типа справочника параметров, из которого оператор будет их добавлять в конкретные объекты. Там, естетсвенно, та же система разделов, по которым эти параметры сгрупированы. В справочнике мы храним тип, наименование и значение по умолчанию. Возможно, что ещё и допустимый диапазон значений для данного параметра. Я бы ещё сделал к справочнику третью таблицу (кроме разделов и самих параметров), где бы при необходимости можно было хранить список допустимых или наиболее часто используемых значений, которые пользователь потом сможет выбирать с помощью ComboBox'а. Насколько я знаю эту предметную область (строительство), то там это встречается очень часто. Те же материалы конструкций или диаметры труб, марка бетона, цемента, металла и т.п. Причём тут, опять же, в большинстве случаев достаочно ограничется обычным текстовым представлением. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2003, 12:49 |
|
Хранение произвольного кол-ва параметров
|
|||
---|---|---|---|
#18+
2 Jinn В "обычных", то есть реляционных СУБД - это можно назвать недочетом проектирования (если не ошибкой). С этим распространенным мнением хорошо знаком, т.к. сам несколько лет назад его придерживался. Считается, что плодить таблицы - излишество. Однако взгляни еще раз, для чего именно это предлагается (checks, индексы, ограничения целостности на уровне базы). И еще немаловажный вопрос по быстродействию! Когда данные храняться в "своих" таблицах, а не свалены в "кучу" в общих таблицах аттрибутов, все работает гораздо быстрее. И ничуть не сложнее написать "create table", чем "select". Так что, при грамотном подходе проблем не будет. А кто-нить может объяснить внятно, почему плодить таблицы считается ошибкой??? В ООП, например, тысячи классов/объектов - дело нормальное. А если в БД тысячи таблиц - "ошибка проектирования"... И то и другое есть проекция/моделирование сущностей решаемой задачи на конкретные цифровые представления. Вполне понятно желание "скомпоновать" похожие по типу (но не по СМЫСЛУ) данные в "групповых" таблицах, в страхе заблудиться в собственном проекте. Так кто же просит это "вручную" делать. Сначала делаем некий "движок", которому как раз и доверяем автоматизацию этого процесса. Организуем наши сущности в виде иерархических справочников (как Дмитрий Мыльников предложил) в целях удобства навигации, и ... Не так страшен черт, как его малюют - со сложностью можно бороться. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2003, 23:18 |
|
Хранение произвольного кол-ва параметров
|
|||
---|---|---|---|
#18+
vdimas> И еще немаловажный вопрос по быстродействию! Когда данные храняться в "своих" таблицах, а не свалены в "кучу" в общих таблицах аттрибутов, все работает гораздо быстрее. Так индексировать нужно, и все будет OK. Куча-то совсем небольшая. Плюс при такой схеме запросы получаются динамические, что очень плохо для того же быстродействия. Их можно сделать статическими, но сложно. К примеру при OLTP от динамических запросов сервер просто умрет. vdimas> А кто-нить может объяснить внятно, почему плодить таблицы считается ошибкой??? Само по себе много таблиц не есть формальная ошибка. Но если на каждый новый атрибут пользователь будет строить таблицу, то ему нужно выдать привелегию на create/drop database object. Такой пользователь потенциально может сильно испортить настроение DBA. Плюс пользователю нужно выдать привелегию на лазание по системным таблицам, тоже не очень хорошо. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2003, 00:24 |
|
Хранение произвольного кол-ва параметров
|
|||
---|---|---|---|
#18+
Само по себе много таблиц не есть формальная ошибка. Но если на каждый новый атрибут пользователь будет строить таблицу, то ему нужно выдать привелегию на create/drop database object. Такой пользователь потенциально может сильно испортить настроение DBA. Плюс пользователю нужно выдать привелегию на лазание по системным таблицам, тоже не очень хорошо. А как насчет инкапсуляции этих моментов в процедуры? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2003, 01:16 |
|
Хранение произвольного кол-ва параметров
|
|||
---|---|---|---|
#18+
А я думаю, что тут есть ещё один момент. На самом деле количетсво параметров не такое уж "любое" и бесконечное. Я немного эту предметную область знаю, там действительно параметров много, СНиП'ов всяких полно. Но при всём при этом там тоже есть своя внутренняя структура с конечным числом объектов и их свойств. То есть, есть ещё варнат, когда мы делаем не просто справочник параметров, а "хранилище" этих параметров. То есть, таблица создаётся не для каждого объекта, а когда новый параметр добавляется в справочник. Но на самом деле нужно делать прототип и тестирвоать на удобство и быстродействие. Мне приходилось видеть системы с метатаблицами, где к примерно 30 тыс. базовых записей генерилось почти 500 тыс. записей в таблицах параметров. При этом система становилась ну очень сильно тормозной, хотя там что-то такое пытались оптимизировать и практически все операции выполнялись хранимыми процедурами на сервере. Что касается "много таблиц - плохо", то это связано с той же экономией ресурсов. Когда то это были ограничения на количество одновременно открытых файлов, сейчас попытка сэкономить ресурсы сервера. Ведь сервре, как я понимаю, для каждой используемой таблицы будет собственный объект заводить с буферами, таблицей прав пользователей и т.п. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2003, 07:34 |
|
Хранение произвольного кол-ва параметров
|
|||
---|---|---|---|
#18+
vdimas 2 Jinn В "обычных", то есть реляционных СУБД - это можно назвать недочетом проектирования (если не ошибкой). С этим распространенным мнением хорошо знаком, т.к. сам несколько лет назад его придерживался. Считается, что плодить таблицы - излишество. Однако взгляни еще раз, для чего именно это предлагается (checks, индексы, ограничения целостности на уровне базы). И еще немаловажный вопрос по быстродействию! Когда данные храняться в "своих" таблицах, а не свалены в "кучу" в общих таблицах аттрибутов, все работает гораздо быстрее. Ты несколько заблуждаешься. Не "плодить таблицы" а создавать для каждого нового объекта свою таблицу параметров. При таком подходе разработчик должен каждый раз, при появлении нового объекта, создавать новую таблицу параметров. При некоторой удаленности разработчика от заказчика это займет определенное время, что выльется в простой. Да и заказчик за такое удовольствие должен будет платить (поддержка). Заказчику это надо? Теперь о быстродействии. При грамотной индексации и шустром сервере быстродействие будет на уровне RT. На wintel с одним пнем это примерно до 10000 параметров и до 500000 их значений. Ну и до кучи про "кучу" :) В системе можно предусмотреть динамическое создание VIEWS, который разворачивет характеристики объектов в плоскую таблицу, для каждого типа объекта по набору привязанных параметров. Таким образом мы получаем тот же набор таблиц. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2003, 11:23 |
|
Хранение произвольного кол-ва параметров
|
|||
---|---|---|---|
#18+
2 Jinn Уже второй голос утверждает, что можно и некоторого быстродействия достичь на определенном количестве записей - кто же спорит? Только никто еще не высказался по поводу того, а что же делать с checks и constrains? А насчет "ручного" создания - повторюсь, этот процесс можно и нужно автоматизировать, тогда необходимость держать разработчика "на привязи" отпадет сама собой. Мое предложение подразумевает автоматизацию процесса создания таблицы аттрибуттов как основу идеи. 1C не боиться при добавлении полей менять структуры таблиц, а мы что - пальцем деланные? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2003, 19:30 |
|
Хранение произвольного кол-ва параметров
|
|||
---|---|---|---|
#18+
vdimas> А как насчет инкапсуляции этих моментов в процедуры? Конечно можно спрятать в процедуры. Но во-первых динамический SQL все равно остается по крайней мере для создания таблицы, во-вторых нужно очень внимательно продумывать систему, чтоб не позволить пользователью удалить чужую таблицу по ошибке, даже из процедуры. Разработчик ведь тоже от ошибок не застрахован. К тому же создание/удаление таблицы гораздо более медленный процесс, чем добавление/удаление нескольких записей в несколько таблиц, пусть даже это и относительно редкое явление. vdimas> Только никто еще не высказался по поводу того, а что же делать с checks и constrains. Автоматическое поддержание целостности SQL сервером безусловно достоинство предлагаемого решения. Но за него нужно платить теми процедурами, в которые прячутся от пользователя создание/удаление таблиц. Т.е. имеет место выбор: либо с констрейнами бороться с помощью триггеров, либо с таблицами с помощью процедур. Так по-моему проще и безопаснее с констрейнами бороться. Ведь удаление таблицы по ошибке (а ведь это можеть быть таблица customers) гораздо хуже, чем мусор в дочерней таблице, оставшийся по ошибке после удаления записи в родительской таблице. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2003, 22:24 |
|
Хранение произвольного кол-ва параметров
|
|||
---|---|---|---|
#18+
2 c127 Дык, ведь без ума креститься - только нагрешить! Зачем предоставлять возможность удалить таблицу Customers? В интерфейсе готового программного продукта должны присутствовать средства по управлению аттрибутами. Пользователь и знать не должен, что в ответ на его действия могут создаваться , изменяться или удаляться таблицы. Опять же (не перебивать! :)) ), если в неких таблицах атрибутов есть записи, то пользователь просто не имеет права удялять такие таблицы. Сложная логика? Фонарь... ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2003, 22:51 |
|
Хранение произвольного кол-ва параметров
|
|||
---|---|---|---|
#18+
2 vdimas Check и Constrains нужно использовать только тогда, когда это очень критично. Как и внешнии ключи. Все это тормозит работу сервера БД. Лучше, по возможности, обходится без них. В данном случае достаточно будет внешнего ключа с конструкцией delete cascade, для удаления зависимых записей. Если нужно ограничить значение параметра, то строится еще одна или две таблицы, где указаны допустимые значения атрибутовов с привязкой как к атрибуту, так и к типу объекта. И никаких чеков. Ввод данных - через ХП. А вот как ты будешь искать в сотне таблиц объект по значению атрибута, при условии что наименование атрибута и объекта нам неизвестны? Даже сам запрос составить уйдет много времени, не говоря уже о времени поиска. Думать нужно не только о том как хранить, но и о том как добыть. В случае хранения значений атрибутов эта проблема решается "на раз" :) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.08.2003, 15:19 |
|
|
start [/forum/topic.php?fid=32&msg=32155680&tid=1546870]: |
0ms |
get settings: |
10ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
323ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
2ms |
others: | 270ms |
total: | 690ms |
0 / 0 |