Как разделить сущность на сотни полей? - PullRequest
1 голос
/ 10 декабря 2010

Я хотел бы получить предложения по разработке бизнес-приложения CRUD с использованием Silverlight 4, шаблона бизнес-приложения, служб WCA RIA и Entity Framework 4. Приложение отслеживает результаты лабораторных испытаний, выполненных на образцах материала. Он заменяет (сложно поддерживать) существующее веб-приложение. Результаты лабораторных тестов хранятся в двух таблицах «SampleData», состоящих из сотен полей. Таблицы имеют отношение один к одному. Я объединил две таблицы в одну, используя Entity Framework Table Per Type Inheritance, что меня очень порадовало. Примечание. Я решил не изменять структуру базы данных, чтобы избежать разрушения существующего приложения, , но это было учтено.

Моя дилемма в том, как разбить этот огромный стол. Каждая запись представляет образец материала, который проверяется. Логическая группировка полей проводится по лабораторным тестам. Я предполагаю, что мой пользовательский интерфейс имеет несколько вкладок или отдельных страниц - по одной для каждого теста. Проблема на данный момент в том, что я засасываю ВСЕ поля, но отображаю только несколько в выгружаемой DataGrid, и есть заметная задержка. Вместо одной гигантской сущности было бы неплохо иметь несколько сущностей «лабораторного теста» (каждый из которых представляет тип теста), которые являются подмножествами моей одной гигантской таблицы наследования TPT. Как бы я это сделал? Базовая таблица / сущность SampleData содержит поля заголовка и несколько дочерних полей результатов теста. Вторая производная таблица / сущность содержит больше полей результатов теста, связанных с базой SampleID. В случае разделения я должен был бы поддерживать информацию заголовка с каждым объектом Lab Test.

Я готов придерживаться одной гигантской таблицы / сущности (несмотря на небольшое снижение производительности). Тем не менее, я задаюсь вопросом, как лучше создать свой пользовательский интерфейс с этой единой сущностью. Может ли DataForm быть с вкладками? Если я создаю информационную панель со ссылками на лабораторные тесты, как мне синхронизировать информацию заголовка с каждой тестовой страницей?

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

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 15 февраля 2011

Я отвечаю (и принимаю) свой собственный вопрос, чтобы увеличить скорость принятия моего переполнения стека, но мой "ответ" заключается в том, что я еще не нашел ответа.Поскольку мне пришлось двигаться дальше с проектом, я продолжаю использовать одну гигантскую сущность.Я также отошел от Silverlight и превратил проект в приложение WPF из-за различных проблем с Silverlight, таких как неотъемлемый асинхронный доступ к данным.

0 голосов
/ 17 декабря 2010

Я отсканировал пост, в котором обсуждается дизайн базы данных, и должен сказать, что на основании того, что вы сказали, и того факта, что у вас уже есть пользователи, запрашивающие дополнительные тесты (повторяющиеся значения), я бы хотел, чтобы вы пересмотрели редизайн БД.Вы можете создать плоский вид для имитации существующей плоской таблицы образцов-данных и использовать ее для минимизации поломок в существующем приложении.

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

Одна из идей состоит в том, чтобы написать представление, которое выравнивает данные и исключает из негоноль без тестовых ситуаций.Запрос вызовет удивление (вероятно, меня это заинтересует), потому что он выглядит неприятно, но в действительности СУБД прекрасно справляется с оптимизацией и выполнением запроса (в любом случае, в Oracle).У меня были отличные результаты, что-то вроде: *

создать представление programmer_exp_unflat as (выберите programmer_id, 'C #', csharp_yrs из programmer_exp_flat, где csharp_yrs нетnull union выберите programmer_id, 'Java', java_yrs из programmer_exp_flat, где java_yrs не является нулевым union, выберите programmer_id, 'Cobol', cobol_yrs из programmer_exp_flat, где cobol_yrs не является нулевым, повторить xx) повторить xx)от двойного

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

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

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

...