我应该如何为这个问题建模数据库?哪个ORM可以处理它?

时间:2010-05-07 12:57:21

标签: database-design orm

我需要为我们的客户构建某种自定义CMS。这些是一些功能要求:

      
  • 必须能够管理网站中的页面列表
  •   
  • 每个页面可以包含多个 ColumnGroups
  •   
  • ColumnGroup 只不过是某个 ColumnGroupLayout 的列表。例如:“一列占据页面的整个宽度”,“两列各占据宽度的一半”,...
  •   
  • 每个可以包含数字 ContentBlocks
  •   
  • ContentBlock 的示例有: TextBlock NewsBlock PictureBlock ,...
  •   
  • ContentBlocks 可以在
  • 中进行特定排序   
  • ContentBlock 可以放在不同的中,以便无需重复即可重复使用内容。

我的第一篇关于如何在C#代码中看起来的快速草案(我们使用ASP.NET 4.0来开发CMS)可以在我的问题的底部找到。

其中一项技术要求是,必须尽可能简单地将新类型的ContentBlock添加到CMS。所以我想尽可能灵活地模拟一切。不幸的是,我已经坚持试图弄清楚数据库应该是什么样子。

我遇到的一个问题与在列中排序不同类型的ContentBlocks有关。我猜每种类型的ContentBlock(如TextBlock,NewsBlock,PictureBlock,...)应该在数据库中拥有自己的表,因为每个都有自己的不同字段。 TextBlock可能只有一个名为Text的字段,而NewsBlock可能包含Text,Summary,PublicationDate,......的字段。

由于一个Column可以将ContentBlocks放在不同的表中,我想我必须为每种类型的ContentBlock创建多对多关联。例如:ColumnTextBlocks,ColumnNewsBlocks和ColumnPictureBlocks。

我在此设置中遇到的问题是对列中的不同ContentBlock进行排序。这可能是这样的:

      
  1. 的TextBlock
  2.   
  3. NewsBlock
  4.   
  5. 的TextBlock
  6.   
  7. 的TextBlock
  8.   
  9. PictureBlock
  10. 我在哪里存储分拣编号?如果我将它们存储在associaton表中,在更改Column中ContentBlocks的排序顺序时,我将不得不更新很多表。这是解决问题的好方法吗?

    基本上,我的问题是:对此进行建模的最佳方法是什么,请记住添加新类型的ContentBlock应该很容易?

    我的下一个问题是:ORM可以处理哪种建模?说实话,我们是ORM处女在工作。我一直在阅读有关Linq-to-SQL和NHibernate的一些内容,但我们对它们没有经验。由于Column类中的IList(参见下面的代码),我认为我们可以排除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 :(得分:0)

这可能不是你想要的但是......

我发现使用Microsoft Access是一种快速创建功能数据库模型(尽管有限)并测试不同查询逻辑的方法。

然后,使用MS Access可以创建表格,然后尝试不同的迭代,了解所有表格/数据如何快速链接在一起,而无需编写大量代码。