我需要为我们的客户构建某种自定义CMS。这些是一些功能要求:
我的第一篇关于如何在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进行排序。这可能是这样的:
我在哪里存储分拣编号?如果我将它们存储在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.";
}
}
答案 0 :(得分:0)
这可能不是你想要的但是......
我发现使用Microsoft Access是一种快速创建功能数据库模型(尽管有限)并测试不同查询逻辑的方法。
然后,使用MS Access可以创建表格,然后尝试不同的迭代,了解所有表格/数据如何快速链接在一起,而无需编写大量代码。