weizengxun的专栏

我们在做CMS往往会遇到这样的问题,内容类型有几个,这些内容大体上字段都差不多,只有一些字段不一样。如新闻、通知公告(没有来源,多了通知对象)、旅游信息(这里客户可能要有个一费用的字段,方便检索)类似这样的内容类型。往往我们会通过以下的方案进行处理:1、将所有肯能用到的字段都设置到一个表中,这种方案有以下缺点 a、不能很好的确保数据完整性,比如,A类型中的a字段是必须的,但在B类型中是没有的,为了添加数据不报错,必须把a字段设为可为空。 b、数据碎片会变多,不知这种说法是否成立,类型不一样时感觉会生成很多空字段。2、为每个类型定义不同的表,,这种方案没什么可说的,就一个不好的地方,重复工作相对比较多。3、将通用属性写入一个通用属性表中,将附加属性(不通用的属性),写入各自的附表中,这方案中和吧。前面两种相信大家都能想得到,在这里我来讲讲方案三怎么实现。这种方案的表结构大概涉及到这些表ContentItem,ContentTypeDefinitions,ContentTypeColumnDefinitions,addon_xxx表。这些表的作用及关键字段的说明如下:ContentItem-内容表 这个表放在一些通用的字段ContentTypeDefinitions 内容类型定义表(ctd表)-这个表存放内容类型,如新闻News,链接(Links)ContentTypeId int Unchecked–主键没得说ContentTypeName nvarchar(64) Unchecked–名称(如新闻)ContentTypeKey varchar(64) Unchecked–类型Key(如News)IsBuiltIn tinyint Unchecked–是否是内置DisplayOrder int Unchecked–显示顺序TableName varchar(64) Unchecked–存放这些属性的表的tablenameForeignKey varchar(64) Unchecked–关联的外键(ContentItemId)Page_New varchar(128) Unchecked–新建页面的ViewPage_Edit varchar(128) Unchecked–编辑页面的ViewPage_Manage varchar(128) Unchecked–管理页面的Page_Default_List varchar(128) Unchecked–默认列表页Page_Default_Detail varchar(128) UncheckedContentTypeColumnDefinitions 内容类型字段定义表(ctcd表) 定义附表中都有哪些的字段ColumnId int Unchecked–ContentTypeId int Unchecked–所属的内容类型IDColumnName varchar(64) Unchecked–字段名称ColumnLabel nvarchar(128) Unchecked–字段显示名称IsBuiltIn tinyint Unchecked–是否是内置DataType varchar(64) Unchecked–数据类型Length int Unchecked–长度Precision varchar(64) Unchecked–精度IsNotNull tinyint UncheckedDefaultValue nvarchar(64) Unchecked这种设计的原理是,把通用的内容属性放入ContentItem中,把附加属性(不通用的属性)放在各自的附表中(如news则放在addon_news表中)这两者的关系通过ctd表与ctcd表中的定义进行关联,每次获取通用属性之后再根据内容类型获取相应的附加属性,将附加属性存入ContentItem类中的IDictionary<string, object> AdditionalProperties。以上内容参考近乎的CMS这一块的设计。

生活比你想象的要容易得多,只要学会接受那些不可接受的,

weizengxun的专栏

相关文章:

你感兴趣的文章:

标签云: