Динамическая типизированная таблица / модель в Java EE? - PullRequest
3 голосов
/ 18 апреля 2010

Обычно в Java EE при создании Model мы определяем поля и типы полей с помощью XML или аннотации до времени компиляции. Есть ли способ изменить их во время выполнения? Или лучше, возможно ли создать новую модель на основе ввода пользователя во время выполнения? Так, что количество столбцов и типов полей являются динамическими (определяется во время выполнения)?

Помощь очень ценится. Спасибо.

Я чувствовал необходимость прояснить себя.

  1. Да, я имел в виду моделирование базы данных, когда говорил о модели.

  2. Что касается вариантов использования, я хочу предоставить пользователям средства для определения и создания своих собственных таблиц. Бесконечная гибкость не требуется. Однако должна быть некоторая степень свободы: например, пользователи могут определить, какие поля необходимы для описания их продукта.

Ответы [ 4 ]

2 голосов
/ 18 апреля 2010

Похоже, вы хотите иметь возможность изменять как объекты, так и схему в соответствии с пользовательским вводом во время выполнения. Это звучит как хаотический рецепт катастрофы для меня. Я никогда не видел, чтобы это было сделано.

Я видел общие схемы, которые включают отношения внешнего ключа к общим таблицам пар имя / значение, но они, как правило, становятся бесконечно гибкими абстракциями, которые не могут быть ни легко поняты, ни выбраны из их собственного пути, когда дело касается производительности. 1003 *

Готов поспорить, что ваши пользователи действительно не хотят бесконечной гибкости. Я бы предостерег вас от принятия этого направления. Лучше разобраться в реальных случаях использования.

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

1 голос
/ 19 апреля 2010

Я работал в системе, где у нас были такие возможности. Чтобы оставаться эффективными, мы динамически генерируем / изменяем таблицу для схемы клиента. Нам также нужно было встроить метамодель (модель модели) для динамической обработки информации в сущностях.

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

  • Что если тип столбца изменится?
  • Что если добавить столбец? Есть ли значение по умолчанию?
  • Что если столбец удален? Могу ли я отказаться от существующей информации?
  • Как управлять переименованием столбца?
  • Как сделать вещи переносимыми между базами данных?
  • Как сделать его эффективным на уровне базы данных (например, индексы)?
  • Как справиться с человеческой ошибкой (например, пользователь удаляет столбец, а затем передумает)?
  • Как управлять миграцией (сценарием, развертыванием и т. Д.), Когда на сайте заказчика установлена ​​новая версия системы?
  • Как это сделать при использовании ORM?

Вариант 2: Легкая альтернатива - добавить несколько «запасных» столбцов в бизнес-таблицы разных типов (например: «USER_DATE_1», «USER_DATE_2» и т. Д.) несколько раз. Это заставит вашего администратора базы данных кричать и на самом деле не считается хорошей практикой, но, по крайней мере, может облегчить несколько вещей, например, (сценарии миграции, интеграция ORM).

Вариант 3: Другой вариант - сохранить все в таблице со свойством / данными структуры. Но тогда это действительно катастрофа для производительности базы данных. Все, что не совсем тривиально, потребует много соединений. А администратор базы данных будет кричать еще больше.

Вариант 4: Это сочетание вариантов 2 и 3. Основные таблицы фиксированы, но для их расширения можно использовать таблицу со свойством / данными.

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

1 голос
/ 18 апреля 2010

Это как-то возможно, используя методы метамоделирования:

  • таблицы для таблицы / столбца / типов на уровне базы данных
  • структуры ключ / значение на уровне Java

Но это имеет очевидные ограничения (отсутствие строго типизированных объектов) и может ИМХО быстро стать очень сложным (даже не уверен, как справляться с отношениями). Я бы не использовал этот подход для полного определения доменных объектов, а только для расширения существующих (продукты, статьи и т. Д.).

Если я хорошо помню, это то, что делали некоторые решения для электронной коммерции (например, BroadVision).

0 голосов
/ 24 июня 2010

Я думаю, что нашел хороший ответ сам. Эти новые базы данных no-sql (hbase, cassandra), кажется, именно то, что я искал Спасибо всем за ваши ответы.

...