Как мне смоделировать базу данных для этой проблемы? И какой ORM может справиться с этим? - PullRequest
0 голосов
/ 07 мая 2010

Мне нужно создать своего рода 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.

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

  1. TextBlock
  2. 1063 * Новостной блок *
  3. TextBlock
  4. TextBlock
  5. 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.";
    }
}

1 Ответ

0 голосов
/ 07 мая 2010

Это может быть не совсем то, что вы ищете, но ...

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

Тогда использование MS Access позволит вам создавать таблицы, а затем пробовать разные итерации того, как все таблицы / данные будут быстро соединяться друг с другом без необходимости писать много кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...