Да - Поблочное тестирование определенно стоит усилия, но необходимо знать, что это не серебряная пуля. Поблочное тестирование является работой, и необходимо будет работать для держания теста в курсе и релевантный, когда код изменяется, но предлагаемое значение стоит усилия, которое необходимо вставить. Способность осуществить рефакторинг безнаказанно является огромным преимуществом, поскольку можно всегда проверять функциональность путем запущения тестов после любого кода изменения. Прием не должен становиться слишком одержимым точно единицей работы, которую Вы тестируете или как Вы - требования по проведению испытаний лесов и когда модульный тест является действительно функциональным испытанием и т.д. Люди будут спорить об этом материале в течение многих часов подряд, и действительность - то, что любое тестирование Вас делает, поскольку Ваш код записи лучше, чем не выполнение его. Другая аксиома о качестве и не количестве - я видел кодовые базы с 1000-ми теста, которые чрезвычайно бессмысленны, поскольку остальные действительно не тестируют ничего полезного или чего-либо зависящего от домена как бизнес-правила, и т.д. конкретного домена. Я также видел кодовые базы с 30%-м покрытием кода, но тесты были релевантными, значимыми и действительно потрясающими, когда они протестировали базовую функциональность кода, это было записано для и выражено, как код должен использоваться.
Один из моих любимых приемов при исследовании новых платформ или кодовых баз должен записать модульные тесты на 'него', чтобы обнаружить, как работают вещи. Это - отличный способ узнать больше о чем-то новом вместо того, чтобы читать сухой документ:)
Я согласен с приведенными ниже плакатами, что варианты 3, 4 или 5, скорее всего, будут подходящими. Однако каждая из предложенных вами реализаций имеет свои преимущества и недостатки. Я бы посоветовал выбрать тот, который соответствует вашим конкретным требованиям. Например:
PS Как указано ниже, термин «шаблон проектирования» обычно относится к объектно-ориентированному программированию. Вы ищете решение проблемы проектирования базы данных, а это означает, что большинство советов относительно шаблонов проектирования неприменимы.
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:
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.
Я бы выбрал вариант 4 или 5. Если ваши данные важны, я бы не стал выбрасывать информацию о вашем типе с помощью Варианта 3. (Вы можете попробовать реализовать полную проверку типов самостоятельно, но это довольно большая работа, и механизм базы данных уже делает это за вас).
Некоторые мысли:
CustomFields
есть столбец DataType
.
CustomFieldValues
, чтобы убедиться, что столбец, указанный в CustomFields.DataType
, не равен нулю. DataType
.
CustomerCustomFieldValue
, но вместо этого будут только столбцы CustomerID
и CustomFieldValueID
. Я использую это в приложении, которое сейчас находится в разработке. Проблем пока не было, но дизайн EAV все еще пугает меня. Только будьте осторожны.
Кроме того, XML также может быть хорошим выбором. Я не знаю так много об этом из непосредственного опыта, но это был один из вариантов, который я рассматривал при запуске дизайна данных, и он выглядел довольно многообещающим.
Если вы разрабатываете объектно-ориентированный язык, мы говорим об адаптивных объектных моделях . Написано довольно много статей о том, как их можно реализовать на oo-языках, но не так много информации о том, как проектировать сторону хранилища данных.
В компании, где я работаю, мы решили проблему, используя реляционная база данных для хранения данных AOM. У нас есть центральная таблица сущностей для представления всех различных «сущностей» в домене, таких как люди, сетевые устройства, компании и т. Д. Мы храним фактические «поля формы» в типизированных таблицах данных, поэтому у нас есть одна таблица для строки, одна для дат и так далее. Все таблицы данных имеют внешний ключ, указывающий на таблицу сущностей. Нам также нужны таблицы для представления стороны типа, т.е. какие атрибуты (поля формы) могут иметь определенные объекты, и эта информация используется для интерпретации данных в таблицах данных.
Плюсы нашего решения в том, что можно смоделировать все, что угодно, без изменения кода, включая ссылки между объектами, многозначные значения и т. д. на. Также можно добавлять бизнес-правила и проверки в поля, и их можно повторно использовать во всех формах. Минусы в том, что модель программирования не очень проста для понимания, и производительность запросов будет хуже, чем при более типичной конструкции БД. Другое решение, кроме реляционной базы данных, могло бы быть лучше и проще для AOM.
Создание хорошего AOM с рабочим хранилищем данных - это большая работа, и я бы не рекомендовал ее, если у вас нет высококвалифицированных разработчиков. . Возможно, когда-нибудь появится ОС, отвечающая таким требованиям.
Пользовательские поля уже обсуждались ранее в SO:
если эти «дополнительные» поля являются случайными и не хотят выполнять поиск по ним, я обычно выбираю вариант 2 (но как JSON лучше, чем XML). Если будет производиться поиск по настраиваемым полям, вариант 3 выполнить несложно, и обычно оптимизатор SQL может добиться от этого приемлемой производительности.
Что касается кода приложения, я не уверен. Я знаю, что настраиваемые поля значительно выигрывают от модели EAV в базе данных.
Согласно комментариям ниже, наиболее существенная ошибка, которую вы можете сделать с этой моделью, - это добавление в нее внешних ключей. Никогда не помещайте в эту модель что-то вроде FriendID или TypeID. Используйте эту модель в сочетании с типичной реляционной моделью и сохраняйте поля внешнего ключа в столбцах таблицы, как они должны.
Вторая существенная ошибка заключается в размещении данных в этой модели, которые необходимо сообщать с каждым элементом. Например, добавление в эту модель чего-то вроде имени пользователя будет означать, что в любое время, когда вы хотите получить доступ к пользователю и вам нужно знать его имя пользователя, вы в лучшем случае посвятили себя объединению или 2n запросам, где n - количество пользователей, на которых вы смотрите. Если учесть, что вам обычно требуется свойство Username для каждого элемента User, становится очевидным, что оно также должно оставаться в столбцах таблицы.
Однако, если вы просто используете эту модель с настраиваемыми пользовательскими полями, вы будете хорошо. Я не могу вообразить много ситуаций, когда пользователь вводил бы реляционные данные, а модель EAV не слишком вредна для поиска.
Наконец, не пытайтесь объединить данные из этого и получить красивый красивый набор записей. Возьмите исходную запись, а затем возьмите набор записей для объекта. Если вы чувствуете соблазн присоединиться к столам, вы, вероятно, совершили вторую ошибку, о которой говорилось выше.
Если учесть, что вам обычно требуется свойство Username для каждого элемента User, становится очевидным, что оно также должно оставаться в столбцах таблицы.Однако, если вы просто используете эту модель с настраиваемыми пользовательскими полями, вы будете хорошо. Я не могу вообразить много ситуаций, когда пользователь вводил бы реляционные данные, а модель EAV не слишком вредна для поиска.
Наконец, не пытайтесь объединить данные из этого и получить красивый красивый набор записей. Возьмите исходную запись, а затем возьмите набор записей для объекта. Если вы чувствуете соблазн присоединиться к столам, вы, вероятно, совершили вторую ошибку, о которой говорилось выше.
Если учесть, что вам обычно требуется свойство Username для каждого элемента User, становится очевидным, что оно также должно оставаться в столбцах таблицы.Однако, если вы просто используете эту модель с настраиваемыми пользовательскими полями, вы будете хорошо. Я не могу вообразить много ситуаций, когда пользователь вводил бы реляционные данные, а модель EAV не слишком вредна для поиска.
Наконец, не пытайтесь объединить данные из этого и получить красивый красивый набор записей. Возьмите исходную запись, а затем возьмите набор записей для объекта. Если у вас возникнет соблазн присоединиться к столам, вы, вероятно, совершили вторую ошибку, о которой говорилось выше.
Если просто использовать эту модель с настраиваемыми пользовательскими полями, все будет в порядке. Я не могу вообразить много ситуаций, когда пользователь вводил бы реляционные данные, а модель EAV не слишком вредна для поиска.Наконец, не пытайтесь объединить данные из этого и получить красивый красивый набор записей. Возьмите исходную запись, а затем возьмите набор записей для объекта. Если у вас возникнет соблазн присоединиться к столам, вы, вероятно, совершили вторую ошибку, о которой говорилось выше.
Если просто использовать эту модель с настраиваемыми пользовательскими полями, все будет в порядке. Я не могу вообразить много ситуаций, когда пользователь вводил бы реляционные данные, а модель EAV не слишком вредна для поиска.Наконец, не пытайтесь объединить данные из этого и получить красивый красивый набор записей. Возьмите исходную запись, а затем возьмите набор записей для объекта. Если вы чувствуете соблазн присоединиться к столам, вы, вероятно, совершили вторую ошибку, о которой говорилось выше.