Что шаблоны разработки должны поддерживать пользовательские поля в приложении?

Да - Поблочное тестирование определенно стоит усилия, но необходимо знать, что это не серебряная пуля. Поблочное тестирование является работой, и необходимо будет работать для держания теста в курсе и релевантный, когда код изменяется, но предлагаемое значение стоит усилия, которое необходимо вставить. Способность осуществить рефакторинг безнаказанно является огромным преимуществом, поскольку можно всегда проверять функциональность путем запущения тестов после любого кода изменения. Прием не должен становиться слишком одержимым точно единицей работы, которую Вы тестируете или как Вы - требования по проведению испытаний лесов и когда модульный тест является действительно функциональным испытанием и т.д. Люди будут спорить об этом материале в течение многих часов подряд, и действительность - то, что любое тестирование Вас делает, поскольку Ваш код записи лучше, чем не выполнение его. Другая аксиома о качестве и не количестве - я видел кодовые базы с 1000-ми теста, которые чрезвычайно бессмысленны, поскольку остальные действительно не тестируют ничего полезного или чего-либо зависящего от домена как бизнес-правила, и т.д. конкретного домена. Я также видел кодовые базы с 30%-м покрытием кода, но тесты были релевантными, значимыми и действительно потрясающими, когда они протестировали базовую функциональность кода, это было записано для и выражено, как код должен использоваться.

Один из моих любимых приемов при исследовании новых платформ или кодовых баз должен записать модульные тесты на 'него', чтобы обнаружить, как работают вещи. Это - отличный способ узнать больше о чем-то новом вместо того, чтобы читать сухой документ:)

71
задан Sylvain 27 July 2009 в 21:41
поделиться

6 ответов

Я согласен с приведенными ниже плакатами, что варианты 3, 4 или 5, скорее всего, будут подходящими. Однако каждая из предложенных вами реализаций имеет свои преимущества и недостатки. Я бы посоветовал выбрать тот, который соответствует вашим конкретным требованиям. Например:

  1. Вариант 1 Плюсы: Быстро внедрить. Разрешает действия БД с настраиваемыми полями (поиск, сортировка).
    Минусы варианта 1: настраиваемые поля являются общими, поэтому строго типизированных полей нет. Таблица базы данных неэффективна из-за большого количества посторонних полей, которые никогда не будут использоваться. Количество допустимых настраиваемых полей необходимо предвидеть.
  2. Плюсы варианта 2: Быстро внедрить. Гибкость, позволяющая произвольное количество и тип настраиваемых полей.
    Минусы варианта 2: действия с пользовательскими полями невозможны. Это лучше всего, если все, что вам нужно сделать, это отобразить настраиваемые поля позже или выполнить незначительные манипуляции с данными только для каждого клиента.
  3. Вариант 3 за: Гибкость и эффективность. Действия с базой данных могут выполняться, но данные несколько нормализованы, чтобы уменьшить бесполезное пространство. Я согласен с предложением unknown (google) добавить дополнительный столбец, который можно использовать для указания типа или информации об источнике. Минусы варианта 3: незначительное увеличение времени разработки и сложности ваших запросов, но здесь действительно не так много минусов.
  4. Вариант 4 такой же, как вариант 3, за исключением того, что с вашими типизированными данными можно работать в Уровень БД. Добавление информации о типе в таблицу ссылок в Варианте 3 позволяет вам выполнять больше операций на уровне нашего приложения, но, например, БД не сможет выполнять сравнения или сортировку. От этого требования зависит выбор между 3 и 4.
  5. Вариант 5 такой же, как 3 или 4, но с еще большей гибкостью для применения решения к множеству различных таблиц. Стоимость в этом случае будет заключаться в том, что размер этого стола значительно вырастет. Если вы выполняете много дорогостоящих операций соединения для доступа к настраиваемым полям, это решение может плохо масштабироваться.

PS Как указано ниже, термин «шаблон проектирования» обычно относится к объектно-ориентированному программированию. Вы ищете решение проблемы проектирования базы данных, а это означает, что большинство советов относительно шаблонов проектирования неприменимы.

14
ответ дан 24 November 2019 в 13:09
поделиться

Something like Option 3 is the way to go and i have used this method previously. Create a single table to define additional properties and their corresponding values. This would be a 1-N relationship between your Customer and CustomerCustomField table (respectively). Your second question regarding defining relationships with custom properties would be something to think about. The first thing that comes to mind is adding a DataSource field, which would contain the table to which the property value is bound to. So essentially your CustomerCustomField would look like:

  1. CustomerId
  2. Property
  3. Value
  4. ValueDataSource (nullable)

This should allow you to either bind to a specific data structure or simply allow you to specify unbound values. You can further normalize this model, but something like this could work and should be easy enough to handle in code.

3
ответ дан 24 November 2019 в 13:09
поделиться

Я бы выбрал вариант 4 или 5. Если ваши данные важны, я бы не стал выбрасывать информацию о вашем типе с помощью Варианта 3. (Вы можете попробовать реализовать полную проверку типов самостоятельно, но это довольно большая работа, и механизм базы данных уже делает это за вас).

Некоторые мысли:

  • Убедитесь, что в вашем CustomFields есть столбец DataType .
    • Используйте ограничение проверки на основе UDF для CustomFieldValues ​​, чтобы убедиться, что столбец, указанный в CustomFields.DataType , не равен нулю.
    • Вам также понадобится стандартная проверка ограничение, чтобы убедиться, что у вас есть ровно одно ненулевое значение.
  • Что касается внешних ключей, я бы смоделировал их как отдельный DataType .
    • Для каждой потенциальной ссылки на перекрестную таблицу потребуется отдельный столбец. Это хорошо, потому что поддерживает ссылочную целостность.
    • В любом случае вам придется поддерживать эти отношения в коде приложения, поэтому тот факт, что они жестко запрограммированы в базе данных, на самом деле не ограничивает функциональность.
    • Это также будет jive хорошо с вашим ORM, если вы его используете.
  • Для варианта 5 используйте промежуточные таблицы для моделирования отношений.
    • У вас все еще будет CustomerCustomFieldValue , но вместо этого будут только столбцы CustomerID и CustomFieldValueID .
  • Хорошо подумайте о ваших ограничениях на каждом этапе способ. Это непростая задача, и одна ошибка может привести к полному хаосу в будущем.

Я использую это в приложении, которое сейчас находится в разработке. Проблем пока не было, но дизайн EAV все еще пугает меня. Только будьте осторожны.

Кроме того, XML также может быть хорошим выбором. Я не знаю так много об этом из непосредственного опыта, но это был один из вариантов, который я рассматривал при запуске дизайна данных, и он выглядел довольно многообещающим.

3
ответ дан 24 November 2019 в 13:09
поделиться

Если вы разрабатываете объектно-ориентированный язык, мы говорим об адаптивных объектных моделях . Написано довольно много статей о том, как их можно реализовать на oo-языках, но не так много информации о том, как проектировать сторону хранилища данных.

В компании, где я работаю, мы решили проблему, используя реляционная база данных для хранения данных AOM. У нас есть центральная таблица сущностей для представления всех различных «сущностей» в домене, таких как люди, сетевые устройства, компании и т. Д. Мы храним фактические «поля формы» в типизированных таблицах данных, поэтому у нас есть одна таблица для строки, одна для дат и так далее. Все таблицы данных имеют внешний ключ, указывающий на таблицу сущностей. Нам также нужны таблицы для представления стороны типа, т.е. какие атрибуты (поля формы) могут иметь определенные объекты, и эта информация используется для интерпретации данных в таблицах данных.

Плюсы нашего решения в том, что можно смоделировать все, что угодно, без изменения кода, включая ссылки между объектами, многозначные значения и т. д. на. Также можно добавлять бизнес-правила и проверки в поля, и их можно повторно использовать во всех формах. Минусы в том, что модель программирования не очень проста для понимания, и производительность запросов будет хуже, чем при более типичной конструкции БД. Другое решение, кроме реляционной базы данных, могло бы быть лучше и проще для AOM.

Создание хорошего AOM с рабочим хранилищем данных - это большая работа, и я бы не рекомендовал ее, если у вас нет высококвалифицированных разработчиков. . Возможно, когда-нибудь появится ОС, отвечающая таким требованиям.

Пользовательские поля уже обсуждались ранее в SO:

4
ответ дан 24 November 2019 в 13:09
поделиться

если эти «дополнительные» поля являются случайными и не хотят выполнять поиск по ним, я обычно выбираю вариант 2 (но как JSON лучше, чем XML). Если будет производиться поиск по настраиваемым полям, вариант 3 выполнить несложно, и обычно оптимизатор SQL может добиться от этого приемлемой производительности.

0
ответ дан 24 November 2019 в 13:09
поделиться

Что касается кода приложения, я не уверен. Я знаю, что настраиваемые поля значительно выигрывают от модели EAV в базе данных.

Согласно комментариям ниже, наиболее существенная ошибка, которую вы можете сделать с этой моделью, - это добавление в нее внешних ключей. Никогда не помещайте в эту модель что-то вроде FriendID или TypeID. Используйте эту модель в сочетании с типичной реляционной моделью и сохраняйте поля внешнего ключа в столбцах таблицы, как они должны.

Вторая существенная ошибка заключается в размещении данных в этой модели, которые необходимо сообщать с каждым элементом. Например, добавление в эту модель чего-то вроде имени пользователя будет означать, что в любое время, когда вы хотите получить доступ к пользователю и вам нужно знать его имя пользователя, вы в лучшем случае посвятили себя объединению или 2n запросам, где n - количество пользователей, на которых вы смотрите. Если учесть, что вам обычно требуется свойство Username для каждого элемента User, становится очевидным, что оно также должно оставаться в столбцах таблицы.

Однако, если вы просто используете эту модель с настраиваемыми пользовательскими полями, вы будете хорошо. Я не могу вообразить много ситуаций, когда пользователь вводил бы реляционные данные, а модель EAV не слишком вредна для поиска.

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

Если учесть, что вам обычно требуется свойство Username для каждого элемента User, становится очевидным, что оно также должно оставаться в столбцах таблицы.

Однако, если вы просто используете эту модель с настраиваемыми пользовательскими полями, вы будете хорошо. Я не могу вообразить много ситуаций, когда пользователь вводил бы реляционные данные, а модель EAV не слишком вредна для поиска.

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

Если учесть, что вам обычно требуется свойство Username для каждого элемента User, становится очевидным, что оно также должно оставаться в столбцах таблицы.

Однако, если вы просто используете эту модель с настраиваемыми пользовательскими полями, вы будете хорошо. Я не могу вообразить много ситуаций, когда пользователь вводил бы реляционные данные, а модель EAV не слишком вредна для поиска.

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

Если просто использовать эту модель с настраиваемыми пользовательскими полями, все будет в порядке. Я не могу вообразить много ситуаций, когда пользователь вводил бы реляционные данные, а модель EAV не слишком вредна для поиска.

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

Если просто использовать эту модель с настраиваемыми пользовательскими полями, все будет в порядке. Я не могу вообразить много ситуаций, когда пользователь вводил бы реляционные данные, а модель EAV не слишком вредна для поиска.

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

10
ответ дан 24 November 2019 в 13:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: