0

Я выполнял методологию DDD в основном для этого проекта, поэтому, как и любой DDD'er, я сначала создал классы модели домена. Я намерен использовать эти POCO как мои объекты LINQ-to-SQL (да, они не чистые POCO, но я в порядке). Я начал создавать схему базы данных и внешний XML-файл сопоставления, но у меня возникают некоторые проблемы с моделированием связей и ассоциаций сущностей.Использует ли наследование таблицы допустимый способ избежать использования таблицы соединений?

Артефакт представляет собой документ. Артефакты могут быть связаны либо с задачей, либо с случаем. Субъект Дела выглядит следующим образом:

public class Case 
{ 
    private EntitySet<Artifact> _Artifacts; 
    public IList<Artifact> Artifacts 
    { 
      get 
      { 
       return _Artifacts; 
      } 
      set 
      { 
       _Artifacts.Assign(value); 
      } 
    } 
    . 
    . 
    . 
} 

Поскольку артефакт может быть связан либо с футляром, или задачами, я имею возможность использовать наследование от класса артефакта для создания CaseArtifact и TaskArtifact производных классов. Единственное различие между двумя классами, однако, было бы наличием поля Case или поля Task. В базе данных, конечно, у меня будет одна таблица, Артефакт, с полем дискриминатора типа и полями CaseId и TaskId.

Вопрос: является ли это приемлемым подходом к решению этой проблемы или создаст таблицу объединений для каждой ассоциации (2 новых таблицы, всего), чтобы быть лучшим подходом?

ответ

2

Я бы, вероятно, столкнулся с двумя таблицами - это делает ссылочную целостность-PK/FK немного проще обрабатывать в базе данных, так как вам не придется иметь сложное ограничение, основанное на столбце селектора.

(чтобы ответить на ваш комментарий - я столкнулся с таким пространством, как сообщение). Моя общая философия заключается в том, что база данных должна быть смоделирована с использованием лучших практик базы данных (защитите свой периметр и обеспечьте согласованность базы данных, используя столько RI и возможные ограничения, обеспечивайте весь доступ через SP, активность журнала по мере необходимости, управляйте всеми режимами доступа, при необходимости используйте триггеры), а объектная модель должна быть смоделирована с помощью лучших методов ООП для обеспечения мощного и согласованного API. Это задача вашего SP/уровня доступа к данным для устранения несоответствия импеданса.

Если вы просто сохраняете хорошо спроектированную модель объекта в базе данных, ваша база данных не будет иметь значительной внутренней ценности (трудно выполнить анализ данных, склада, метаданных и т. Д.) При просмотре без прохождения объектива объектная модель - это нормально для некоторых приложений, как правило, не для моих.

Если вы просто подражаете хорошо спроектированной структуре базы данных в своем приложении, не предоставляя богатый API OO, ваше приложение будет сложно поддерживать, а внутренние структуры будут неудобны - как правило, очень процедурные, жесткие и с много дублирования кода.

+0

так что вы думаете, что дополнительная сложность иметь две дополнительные объединения таблиц меньше, чем сложность использования ИППП?Поскольку я использую L2S, это означало бы, что у меня бы был EntitySet в моих классах, вместо прямой ссылки, правильно? –

+0

См. Мое редактирование. Обычно у меня есть модель OO, которая не имитирует базу данных. Не зная достаточно, у меня, вероятно, был бы либо Artifact.Case, либо Artifact.Task действителен (XOR) или имеет два класса CaseArtifact с .Case и TaskArtifact с .Task и Case.Artifacts - это совокупность всех Артефактов, связанных с Кейсом и Task.Artifacts - это совокупность всех Артефактов, связанных с Задачей. –

+0

Вы поднимаете некоторые очень хорошие моменты в своем редактировании. Предоставление богатого API является одной из основных целей моего дизайна. Освобождение некоторое время, прежде чем Duke Nukem Forever также очень важен. Я решил, что мне придется сделать некоторые компромиссы для моей модели домена, чтобы «заставить ее работать» с L2S. Результирующая модель домена ближе, чем к схеме БД, чем я особенно забочусь, но, надеюсь, все еще OO достаточно, чтобы разоблачить богатый API. Я пошел с таблицами соединений, как было предложено, добавив их в другую папку проекта, чтобы отделить их от «реальных» объектов домена. –

1

Я хотел бы рассмотреть в поиске сходств между случае и задачи, из-за отсутствия лучшего слова давайте назовем это «CaseTask», а затем суб-типирование (наследовании) от того. После этого вы прикрепляете документ к супертипу.

ОБНОВЛЕНИЕ (после комментариев):
Тогда я бы подумал об этом. Каждый документ может быть прикреплен к нескольким случаям или задачам.



artifact_model_01D

+0

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

+0

Итак, у одного случая много задач? Не могли бы вы объяснить взаимосвязь между случаями и задачами? –

+0

уверен. С ним связан рабочий процесс. Рабочий процесс представляет собой набор задач, а также некоторые другие свойства. Рабочий процесс связан с конкретным случаем, но отдельные задачи в рабочем процессе не являются, поскольку они содержатся в самом рабочем процессе. –

Смежные вопросы