Мне нужно создать своего рода CMS для нашего клиента. Вот некоторые из функциональных требований:
- Должен иметь возможность управлять списком Страниц на сайте
- Каждая Страница может содержать несколько Группы столбцов
- A ColumnGroup - не более чем список Столбцов в определенном ColumnGroupLayout . Например: «один столбец занимает всю ширину страницы», «два столбца занимают половину ширины», ...
- Каждый Столбец может содержать число ContentBlocks
- Примеры ContentBlock : TextBlock , NewsBlock , PictureBlock , ...
- ContentBlocks может быть задана определенная сортировка в столбце
- A ContentBlock можно поместить в разные Столбцы , чтобы содержимое можно было повторно использовать без дублирования.
Мой первый краткий черновик того, как это может выглядеть в коде C # (мы используем ASP.NET 4.0 для разработки CMS), можно найти в нижней части моего вопроса.
Одним из технических требований является то, что должно быть как можно проще добавлять новые типы ContentBlocks в CMS. Поэтому я бы хотел, чтобы все было максимально гибким. К сожалению, я уже пытался понять, как должна выглядеть база данных.
Одна из проблем, с которыми я сталкиваюсь, связана с сортировкой различных типов ContentBlocks в столбце. Я предполагаю, что каждый тип ContentBlock (например, TextBlock, NewsBlock, PictureBlock, ...) должен иметь свою собственную таблицу в базе данных, потому что у каждого есть свои собственные различные поля. TextBlock может иметь только поле с именем Text, тогда как NewsBlock может иметь поля для Text, Summary, PublicationDate, ...
Поскольку один столбец может иметь блоки содержимого в разных таблицах, я думаю, мне придется создать связь «многие ко многим» для каждого типа блока контента. Например: ColumnTextBlocks, ColumnNewsBlocks и ColumnPictureBlocks.
Проблема, с которой я столкнулся при этой настройке, заключается в сортировке различных блоков контента в столбце. Это может быть что-то вроде этого:
- TextBlock
- 1063 * Новостной блок *
- TextBlock
- TextBlock
- PictureBlock
Где хранить номер сортировки? Если я сохраню их в связанных таблицах, мне придется обновить множество таблиц при изменении порядка сортировки ContentBlocks в столбце. Это хороший подход к проблеме?
По сути, мой вопрос: каков наилучший способ смоделировать это, учитывая, что должно быть легко добавлять новые типы ContentBlocks?
Мой следующий вопрос: что ORM может иметь дело с такого рода моделированием? Если честно, мы ORM-девственницы на работе. Я немного читал о Linq-to-SQL и NHibernate, но у нас нет опыта работы с ними. Из-за IList в классе Column (см. Код ниже), я думаю, мы можем исключить Linq-to-SQL, верно? Может ли NHibernate обрабатывать сопоставление данных из множества разных таблиц в один IList?
Также имейте в виду, что это всего лишь небольшая часть домена. Другими частями являются Пользователи , принадлежащие к определенной группе пользователей с определенными разрешениями для Страницы , Группы столбцов , Столбцы и ContentBlocks .
Код (просто быстрый первый набросок):
public class Page
{
public int PageID { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public string Keywords { get; set; }
public IList<ColumnGroup> ColumnGroups { get; set; }
}
public class ColumnGroup
{
public enum ColumnGroupLayout { OneColumn, HalfHalf, NarrowWide, WideNarrow }
public int ColumnGroupID { get; set; }
public ColumnGroupLayout Layout { get; set; }
public IList<Column> Columns { get; set; }
}
public class Column
{
public int ColumnID { get; set; }
public IList<IContentBlock> ContentBlocks { get; set; }
}
public interface IContentBlock
{
string GetSummary();
}
public class TextBlock : IContentBlock
{
public string GetSummary()
{
return "I am a piece of text.";
}
}
public class NewsBlock : IContentBlock
{
public string GetSummary()
{
return "I am a news item.";
}
}