Как организовать домен?
От: Ocenochka  
Дата: 17.09.11 08:58
Оценка:
Подскажите как лучше реализовать домен:

Есть проедметная область с двумя сущностями "проект документа" и "утвержденный документ".
Обе сущности представляют собой по сути один и тот же документ в разных состояниях.
"Проект документа" — это набор невалидированных полей на которые никто не ссылается, кроме "заявки на рассмотрение проекта документа" (еще одна сущность предметной области, содержит поля: дата подачи, дата рассмотрения, статус).
"Утвержденный документ" — это тот же проект, но в валидном состоянии, плюс иногда может отличаться от проекта парочкой полей. На него ссылается пол базы, просто так его не удалить (отдельный вопрос в p.s.).
(иногда, потому что есть не только проекты документов, но и проекты других сущностей).

Собственно вопрос в том, как это реализовать в коде и реляционной базе.
Инструментарий: .NET, NHibernate, DI.

Я вижу два варианта:
1. сделать практический одинаковый набор классов и таблиц отдельно для проекта и отдельно для утвердженного документа.
Такой вариант мне не очень нравится, т.к. у документов есть множество агрегируемых сущностей — в итоге в базе будет два больших почти одинаковых графа объектов.
2. унаследовать классы от абстрактного "документа" и хранить все в одном наборе таблиц в базе. проект от утвержденного документа отличается столбцом.
То же не нравится, т.к. сущности могут начать расходиться по набору полей и рефакторить потом прилично.

Кто-нибудь знает примеры реализации подобного в крупных или известных системах?

p.s. Дополнительный вопрос в том, как удалять сущности, на которые ссылается половина базы? Я слышал что в 1С это сделано не физическим удалением из базы, а пометкой записи как удаленной. Я сам склоняюсь к такому варианту, но аргументом противников такого метода может быть необходимость в большинстве запросов все время проверять этот статус. Есть еще вариант переносить содержимое удаленной записи в другую таблицу/базу (сложный, на мой взгляд, вариант).
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Люблю ставить оценки.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.