|
|
|
Динамическое добавление полей в таблицах и метаданные
|
|||
|---|---|---|---|
|
#18+
Добрый день коллеги! Есть задача и я не знаю с какой стороны к ней подойти. Собственно дело в следующем... Создается база данных, клиент требует сделать динамическое добавление полей таблиц (с разными типами данных), т.к. поля однозначно будут добавлятся и делать это каждый раз вручную никто не будет. Штука здесь не только в динамическом добавлении полей но и еще в сздании т.н. "структуры метаданных", что позволит как-то идентифицировать назначение поля. Роль метаданных не только в идентификации поля но еще и в принадлежности контексту... т.е. если поле принадлежит сущности "яблоки" - у нас должна быть возможность вытащить и показать с помощью метаданных все что связано с яблоками... в то-же время, если часть полей принадлежит сущности "апельсины", то мы их не должны показывать, ну и т.д. Как это реализуемо в SQL Server? Примеры структур? И еще... как ввод этой логики может повлиять на производительность БД? Модератор: Тема перенесена из форума "Microsoft SQL Server". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2014, 11:40 |
|
||
|
Динамическое добавление полей в таблицах и метаданные
|
|||
|---|---|---|---|
|
#18+
Нужен банальный EAV. В минимальном варианте нужно всего 2 таблицы. зы: тема здесь сто раз обсосана. Добавление полей (куда бы то ни было) в сабжевой задаче - тупик. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2014, 14:39 |
|
||
|
Динамическое добавление полей в таблицах и метаданные
|
|||
|---|---|---|---|
|
#18+
LSVНужен банальный EAV. В минимальном варианте нужно всего 2 таблицы. зы: тема здесь сто раз обсосана. Добавление полей (куда бы то ни было) в сабжевой задаче - тупик. Уважаемый LSV, спасибо за ответ! Вы не могли бы прояснить что такое EAV (я никогда не делал подобных задач), а также, почему "Добавление полей (куда бы то ни было) в сабжевой задаче - тупик"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2014, 15:41 |
|
||
|
Динамическое добавление полей в таблицах и метаданные
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2014, 16:43 |
|
||
|
Динамическое добавление полей в таблицах и метаданные
|
|||
|---|---|---|---|
|
#18+
AllaireВы не могли бы прояснить что такое EAV (я никогда не делал подобных задач), а также, почему "Добавление полей (куда бы то ни было) в сабжевой задаче - тупик"?1. Ключ-Параметр-Значение. Отдельная таблица. 2. Тупик, потому что делать это каждый раз, когда вдруг понадобится новый параметр - плохая практика. Давать пользователю админские права на изменение схемы данных ? Это жесть. Как реплицировать такую таблицу ? Удаление или изменение параметра может быть болезненным. Кто напишет код, кот. зачитает или проапдейтит этот параметр ? Новое поле может быть задействовано у пары записей из миллиона (разреженная матрица). Большое число параметров может превысить допустимое кол-во столбцов таблицы в некот. СУБД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2014, 17:47 |
|
||
|
Динамическое добавление полей в таблицах и метаданные
|
|||
|---|---|---|---|
|
#18+
Allaire клиент требует сделать динамическое добавление полей таблицЭто точно клиент требует? Обычно клиенту пофиг что там с базами/таблицами/полями. По моему опыту, это требует постановщик, который не хочет/не может/не решается зафиксировать свои требования. И любое решение здесь будет попыткой решать организационные проблемы техническими способами. Таки да, вы можете смастерить EAV для дополнительных полей. Просто помните про две неустранимые проблемы EAV: производительность - строки размазаны по таблице, трудности с индексацией "гибкость" - которая имеет свою темную сторону - такая база сожрет и не подавится любой мусор: левую таблицу, левое поле, левое значение, левого типа. Так что либо не совершайте ошибок либо контролируйте все в приложении. Allaire делать это каждый раз вручную никто не будетА почему кстати? Поля они не сами по себе существуют, а отвечают за некий функционал. Меняете приложение, меняйте и базу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2014, 17:56 |
|
||
|
Динамическое добавление полей в таблицах и метаданные
|
|||
|---|---|---|---|
|
#18+
AFAIK Тут два подхода: 1. "Универсальная" структура. Например EAV (как уже сказано), или хранить все в XML, или вообще хранить в какой нибудь NoSQL базе данных (вроде сейчас это модно). 2. По своим метоописаниям динамически перестраивать структуру таблиц (давать необходимые ALTER TABLE, CREATE etc...) Первое плохо тем, что нормальные индексы по такой структуре Вы не построите. Соответственно, весь более-менее сложный поиск будет стоять колом. Второе плохо тем, что на момент регламентных операций перестройки, скорее всего, придется блокировать (останавливать) всю систему. Ну и собственно перестройка может занимать дофига времени. Плюс, истинные тру-админы возможно будут уверяют что это плохо ))) и придумывать кучу проблем ))) но AFAIK это исключительно от размера той части тела, которая мешает танцорам ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2014, 18:16 |
|
||
|
Динамическое добавление полей в таблицах и метаданные
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevВторое плохо тем, что на момент регламентных операций перестройки, скорее всего, придется блокировать (останавливать) всю систему. Если сделать чуть поумнее, и разделить данные на постоянную часть (условно, таблица CLIENTS, на которую завязана бизнес-логика) и динамическую (условно, таблица CLIENTS_ADDITIONAL_FIELDS, на которую ничего не завязано), то ничего особенного блокировать и останавливать не придётся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2014, 18:31 |
|
||
|
Динамическое добавление полей в таблицах и метаданные
|
|||
|---|---|---|---|
|
#18+
Спасибо, вроде разобрался как это работает и действительно, по сравнению с этим методом - добавление новых полей таблицы это утопия. Но есть еще вторая часть вопроса в сабже... собственно "метаданные" сущности. Другими словами... есть к примеру "Покупатель А", внося его в базу возникла необходимость создать 3 дополнительных поля (атрибута) согласно нашей ЕАВ модели, а есть к примеру "Покупатель В" - после его появления мы вносим еще 2 поля (атрибута). Все эти атрибуты "расширяют" функционал основной таблицы, но где здесь контекстная зависимость? Получится так что результат запроса по "Покупателю А" выдаст 3 его поля и два пустых и наоборот для "Покупателя В" - два его поля и три пустых... или я что-то путаю? т.е. мне здесь нужно чтобы расширяемые поля зависели от контекста. Что если таких расширяемых таблиц будет 10-15? Тяжело представить себе запросы... Вариант с xml мне понравился... и он вроде как решает проблему с контекстной зависимостью. Т.е. к примеру если каждый Покупатель из таблицы покупателей будет иметь поле с xml-иной, то фактически мы можем расширять поля для каждого покупателя индивидуально. 2012 сервер вроде бы даже делает индексацию xml. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2014, 19:16 |
|
||
|
Динамическое добавление полей в таблицах и метаданные
|
|||
|---|---|---|---|
|
#18+
SERG1257Это точно клиент требует? Обычно клиенту пофиг что там с базами/таблицами/полями. По моему опыту, это требует постановщик, который не хочет/не может/не решается зафиксировать свои требования. Точно... но я не вижу разницы клиент/постановщик - будем говорить project-owner, разбирающийся в моделях данных ) Зафиксировать поля они не хотят (и/или не могут) т.к.: 1. Они меняются взависимости от случая 2. Они хотят сделать эти "динамические" поля контекстно-зависимыми (т.к. каждая entity в таблице,скажем характеристика покупателя, зависит от каждого конкретного покупателя... у одного покупателя их может быть 5 а у другого 7 и т.д.). 3. Говорят что многое прояснится по мере использования системы (т.е. они хотят оставить такой себе backdoor но без дополнительных development efforts). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2014, 19:32 |
|
||
|
Динамическое добавление полей в таблицах и метаданные
|
|||
|---|---|---|---|
|
#18+
Allaire "Покупатель А", внося его в базу возникла необходимость создать 3 дополнительных поляПримерчик пожалуйста. чтобы с бухты-барахты необходимо поля добавлять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2014, 19:35 |
|
||
|
Динамическое добавление полей в таблицах и метаданные
|
|||
|---|---|---|---|
|
#18+
Короче ты попал - клиент не знает чего хочет, но это должно быть круто. Читай Эдварда Йордона "Путь камикадзе. Как разработчику программного обеспечения выжить в безнадежном проекте" Делай EAV - проект просто не доживет до проблем EAV. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2014, 19:46 |
|
||
|
Динамическое добавление полей в таблицах и метаданные
|
|||
|---|---|---|---|
|
#18+
SERG1257Allaire "Покупатель А", внося его в базу возникла необходимость создать 3 дополнительных поляПримерчик пожалуйста. чтобы с бухты-барахты необходимо поля добавлять. Ну к примеру... для идентификации некоторых покупателей есть необходимость, кроме города вводить еще и округ. Предположим что это небыло запланировано в приложении заранее и понятно, что такая информация обычно выносится в "контакты", но опять-же, пример по покупателям чисто гипотетический.... Мы можем это поле создать с помощью атрибутов (EAV модель кот. обсуждалась ранее) или прикрепить xml файл, который собственно определяет дополнительные поля для каждого "покупателя". Опять-же - в этой задаче есть трюк, мы отражаем информацию по каждому покупателю инфивидуально, т.е. один может иметь одно такое поля, другой два-три-пять и т.д. и на экран нужно выводить ровно столько, сколько определено (набор полей зависит от контекста, т.е. от каждого конкретного покупателя - это самое важное). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2014, 19:53 |
|
||
|
Динамическое добавление полей в таблицах и метаданные
|
|||
|---|---|---|---|
|
#18+
AllaireSERG1257пропущено... Примерчик пожалуйста. чтобы с бухты-барахты необходимо поля добавлять. Ну к примеру... для идентификации некоторых покупателей есть необходимость, кроме города вводить еще и округ. Предположим что это небыло запланировано в приложении заранее и понятно, что такая информация обычно выносится в "контакты", но опять-же, пример по покупателям чисто гипотетический.... Мы можем это поле создать с помощью атрибутов (EAV модель кот. обсуждалась ранее) или прикрепить xml файл, который собственно определяет дополнительные поля для каждого "покупателя". Опять-же - в этой задаче есть трюк, мы отражаем информацию по каждому покупателю инфивидуально, т.е. один может иметь одно такое поля, другой два-три-пять и т.д. и на экран нужно выводить ровно столько, сколько определено (набор полей зависит от контекста, т.е. от каждого конкретного покупателя - это самое важное).Так и в чём проблема-то? Есть у покупателя список его характеристик. У Покупателя А там одна запись, у Покупателя Б две. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2014, 20:00 |
|
||
|
Динамическое добавление полей в таблицах и метаданные
|
|||
|---|---|---|---|
|
#18+
Если надо только выводить то одно большое поле "примечание" легко с этим справится Вечер перестает быть томным если надо по этим полям искать или использовать как нибудь в расчетах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2014, 20:01 |
|
||
|
Динамическое добавление полей в таблицах и метаданные
|
|||
|---|---|---|---|
|
#18+
Allaire прикрепить xml файл, который собственно определяет дополнительные поля для каждого "покупателя".По сути и будет продвинутым полем "примечание" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2014, 20:03 |
|
||
|
Динамическое добавление полей в таблицах и метаданные
|
|||
|---|---|---|---|
|
#18+
авторкаждая entity в таблице,скажем характеристика покупателя, зависит от каждого конкретного покупателя... у одного покупателя их может быть 5 а у другого 7 и т.д..Не вижу проблемы. У меня для этого есть признак "обязательный атрибут". Это значит, что он обязательно появится в списке, даже если он не заполнен. Иначе его не видно. Но добавить и заполнить можно. При вставке нового значения в карточку, пользователь выбирает один из доступных атрибутов, зарегистрированных на этот тип документа. Если нужно создать (не путаем с "заполнить") новый атрибут, то вызывается соотв. форма, в кот. настраивается новый атрибут. Затем он добавляется в карточку сущности и заполняется значением. И с проверкой не вижу никаких сложностей. Вставка значения должна пройти процедуру верификации. Обычного SQL достаточно, т.к. все данные для проверки у нас есть: сущность, к кот. добавляют значение и тип атрибута. Какая проблема для контрагента "физлицо" проверить наличие паспортных данных ? Никаких. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2014, 10:45 |
|
||
|
Динамическое добавление полей в таблицах и метаданные
|
|||
|---|---|---|---|
|
#18+
softwarerЕсли сделать чуть поумнее, и разделить данные на постоянную часть (условно, таблица CLIENTS, на которую завязана бизнес-логика) и динамическую (условно, таблица CLIENTS_ADDITIONAL_FIELDS, на которую ничего не завязано), то ничего особенного блокировать и останавливать не придётся. Ну и будет в результате тот же EAV. Поля в базе данных "на которые НЕ завязана бизнес-логика" это уже круто. Если на них ничего не завязано - нафиг их вообще хранить. А раз поля в БД есть, то явно, на них хоть что-то завязано. IMHO & AFAIK. Можно, конечно, делать как Oracle в OeBS: Attribute1, Attribute2...Attribute15 но это опять таки получается "универсальная структура" и стоит в поле с типом char сохранить date и потом пытаться по этому искать.... становится печально... В модуле "Качество" по такой методике аж под 100 атрибтов нарезано, да еще и разного типа. Но это уже получается помойка. softwarer...то ничего особенного блокировать и останавливать не придётся. "особенно" это понятие относительное. Ну заблокировали пользователей на 5-10 мин., в 99.99% задач - не смертельно. Особенно, когда это сделано по нормальному и отдельной кнопкой "применить изменения"/"перестроить". Настроили систему, в конце рабочего дня нажали кнопку "перестроить" Пользователи утром пришли - радость, новые поля на экране. Знаю программиста и систему, где было и тот и другой путь сделан. Т.е. хочешь EAV, хочешь обычные таблицы. Но это у него получилось исторически. Сначала сделал EAV, когда все встало "колом" допилил обычные таблицы с индексами, а старую веточку в программе с EAV оставил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2014, 15:42 |
|
||
|
Динамическое добавление полей в таблицах и метаданные
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev...Знаю программиста и систему... SERG1257Короче ты попал - клиент не знает чего хочет, но это должно быть круто... Ну в том конкретном случае, задача ставилась так (ДОСЛОВНО): "Нам нужно 400 полей, но мы не знаем каких" ( C ) архитектор системы а программист только устроился на работу, еще испытательный срок не закончился, взял и сделал по такому ТЗ ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2014, 15:47 |
|
||
|
Динамическое добавление полей в таблицах и метаданные
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevНу и будет в результате тот же EAV Чушь. Будет просто расширяющая таблица, связанная один к одному. Leonid KudryavtsevПоля в базе данных "на которые НЕ завязана бизнес-логика" это уже круто. Если на них ничего не завязано - нафиг их вообще хранить. "Выдать в селекте" - это не бизнес-логика (заслуживающая упоминания). Проблемы с перестроением начинаются тогда, когда над таблицей работает куча ХП, а мы при этом пытаемся всунуть в неё очень важное поле "примечания для сотого клиента". Расширение позволяет разделить, ХП в 99.9% лезут в одну таблицу, а "примечания" добавляются в другую. Leonid KudryavtsevНу заблокировали пользователей на 5-10 мин., в 99.99% задач - не смертельно. Если бы была гарантия, что это будет именно 5-10 мин... Иногда это может занять час-два, как следствие, собьёт или заблокирует ночные джобы. А если у компании филиалы в Калининграде и в Хабаровске, то на московском сервере может оказаться непросто найти технологический интервал. А провайдеры обслуживают круглосуточно и очень не любят из-за вендоров софта тормозить обслуживание. И так далее. Leonid KudryavtsevЗнаю программиста и систему, где было и тот и другой путь сделан. Я считаю это вполне разумным подходом. Общая метаинформация, если поле нужно для скорости - пихаешь в таблицу, если фигня - оставляешь в "списке примечаний". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2014, 16:19 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=38801183&tid=1540743]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
171ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
| others: | 11ms |
| total: | 271ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...