问题描述
说实话,我是从来不进类似于CSDN这种网站的,自从上次在博客园被鄙视后也没怎么进了,也没怎么钻研过技术,大多时候都是遇到问题再学,嘿嘿,这次也不例外了。刚毕业出来参加工作,公司主营业务也不在网站这一块,也无非就是给一些客户顺带做做企业网站罢了,我是自学了asp.net,基本上关于网站的这些东西多少也会点,自己毕业前写了个“CMS”,这是当初的理解,结果现在发现什么都好,就是没有“自定义字段”或者说“内容模型”这种类似的东西,所以我把CMS打上了引号,哈哈反观现在所做的东西,突然发现之前自己写的根本没法用,当初竟想着完善各种东西,结果连发一篇文章都需要填写各种东西,太过繁琐,而且所有字段和实体都是固定的,没有一丝灵活性可言,简直就是一个汇集了N个增删改查的玩意儿。当然功能挺完善的,自我感觉良好。。。。。现在上班做网站基本都是用现成的CMS,由于我是学asp.net,也没用PHP写的程序,公司里面之前用的aspcms,我现在用的国内某“开源”CMS,连个说明文档都没有,写个模板调用数据库都得去看源代码,我讨厌这个,也看不懂。于是一个疯狂的念头萌发了。。。总结了一下现在用过的CMS,主要核心几点集中在属性的扩展、模板引擎和插件这几个方面,当然太复杂的东西我也没看,比如orchard,我拿着捣鼓了一下午,什么都不会,哈哈哈哈。。。。。而模板引擎和插件这些功能基本上都已经在我上一个写的网站中实现了,那么还剩下内容模型这个玩意儿,其实说到底,突然觉得这才是最重要的,把一切交给用户,无需代码即可生成并管理各种内容,当然我还是不太理解这到底算不算是“CMS”呢?当然最主要的问题还是一点,目前对于实现这样效果的原理根本没有一点头绪,查过几天资料,发现了一个稍微有点可行的方法。三张表,一张存储普通的内容,并且有预置的字段,第二张表存储扩展字段名称等信息,第三张表存储第二张表中定义的扩展字段的内容,通过外键与其关联。第一张表再用字段存储其中使用了第二张表中添加的哪些字段的信息及其值在第三个表中值的主键。。。。。突然感觉把自己绕进去了。。。。。哈哈,但隐约觉得好像能实现的样子。。。。。。。好吧,我自己也不知道怎么回事儿了,突然对这个感兴趣,应该也只是因为能解决自己的实际问题罢了。。。。在网上查不到多少资料,别人的源代码我也看不懂,有没有人愿意讨论讨论这个问题呢?或者说已经做过的朋友能否分享一下思路呢?说到我感兴趣的原因,其实很简单,我目前用asp.netmvc4.0给客户做,很多时候都是相同的需求,但就因为数据字段这一块的要求很特殊,导致浪费很多时间,那如果说能够有一个思路实现像市面上流行的CMS那样的类似于“内容模型”或“扩展字段”的效果的话,能够节省很多时间。但市面上很多CMS都是asp.netwebform,可借鉴的的确挺少的,我是希望最好能用ef就是搞定,嘿嘿嘿。。。。。。至于我上面说到的那个坑爹版的实现方式,估计问题很多,连我自己也沒理清楚,另外肯定还会有效率相关的问题,以后整理数据库的时候估计更麻烦,所有东西放在一起了。。。呵呵。希望有相关经验的朋友能分享一下啊干货啊。。。。。
解决方案
解决方案二:
引用楼主a15086660050的回复:
三张表,一张存储普通的内容,并且有预置的字段,第二张表存储扩展字段名称等信息,第三张表存储第二张表中定义的扩展字段的内容,通过外键与其关联。第一张表再用字段存储其中使用了第二张表中添加的哪些字段的信息及其值在第三个表中值的主键。。。。。突然感觉把自己绕进去了。。。。。哈哈,但隐约觉得好像能实现的样子。。。。。。。好吧,我自己也不知道怎么回事儿了,突然对这个感兴趣,应该也只是因为能解决自己的实际问题罢了。。。。在网上查不到多少资料,别人的源代码我也看不懂,有没有人愿意讨论讨论这个问题呢?或者说已经做过的朋友能否分享一下思路呢?说到我感兴趣的原因,其实很简单,我目前用asp.netmvc4.0给客户做,很多时候都是相同的需求,但就因为数据字段这一块的要求很特殊,导致浪费很多时间,那如果说能够有一个思路实现像市面上流行的CMS那样的类似于“内容模型”或“扩展字段”的效果的话,能够节省很多时间。但市面上很多CMS都是asp.netwebform,可借鉴的的确挺少的,我是希望最好能用ef就是搞定,嘿嘿嘿。。。。。。
这种东西叫做DDL,在任何关系数据库系统中都有,它是与DML对应的,它负责动态地“查询一个表的字段定义、外键定义、增减字段、创建索引和外键”等等等等许多功能。也就是说,一个数据库可以是完全“空的”,没有任何数据库表、也没有任何字段、也没用主键和外键,甚至没有任何存储过程和触发器等等。全都可以用很简单的sql语句来动态创建和查询。看来你学习数据库sql时只学过最简单的、别人创建好表结构之后的“增删改查”,没有学过DDL。
解决方案三:
你说的那种肯定会把你给“绕进去”的,因为它繁琐而无用。用户在界面上输入知识库中某类知识都有哪些属性(显然与其它知识的数据结构不同),分别是什么类型,哪些属性是对应着栏目的某个属性信息,然后“按下确认键”,这时候你打开数据库表一看,数据库中已经产生相应的“新数据表”了,而且连外键都创建好了,甚至触发器都自动生成了。这就是DDL。哪里用什么“3张表”?用你的3张表不但创建繁琐,将来调用和查询编程更加是超级指数级的耦合度的。
解决方案四:
不知道DDL而只知道DML,基本上你对关系数据库“应用技术”的最基本的sql语句部分也只学了一半。相当于一个厨师,只学了如何切菜炒菜的技艺,但是偏偏没有学如何调料的技艺(调料是多么重要啊!)。如果你只学了DML,那是社会上的培训班的做法,不是一个正规学校的做法。正规学校至少要花5个课时来讲DDL,从而告诉你如何开发一个“工具”来给用户自助地编辑数据库表结构。
解决方案五:
是的,您说得很对,我是现在才知道什么是ddl和dml,可以这么说,我的增删改查语句都用得不是很好。但如果是动态的创建了表,那是不是意味着程序也需要重新编译呢?比如如果用了entityframework,我很喜欢一款CMS,叫dtcms,他这个就很容易上手,功能也好,但由于作者并没有使用mvc,或者说是自己实现了一种mvc,很多基础的东西跟我的想法有很大的差别,您能否介绍一下如果是在asp.netmvc下,有没有什么可行的方法呢?因为dtcms好像是生成了aspx物理文件,很多东西好像跟我想的不太一样,另外我也希望不需要物理的创建某个包含N个扩展字段的表来存储数据,当然可能不太现实,嘿嘿,望指教啊
解决方案六:
引用4楼a15086660050的回复:
是的,您说得很对,我是现在才知道什么是ddl和dml,可以这么说,我的增删改查语句都用得不是很好。但如果是动态的创建了表,那是不是意味着程序也需要重新编译呢?比如如果用了entityframework,我很喜欢一款CMS,叫dtcms,他这个就很容易上手,功能也好,但由于作者并没有使用mvc,或者说是自己实现了一种mvc,很多基础的东西跟我的想法有很大的差别,您能否介绍一下如果是在asp.netmvc下,有没有什么可行的方法呢?因为dtcms好像是生成了aspx物理文件,很多东西好像跟我想的不太一样,另外我也希望不需要物理的创建某个包含N个扩展字段的表来存储数据,当然可能不太现实,嘿嘿,望指教啊
CMS和你是否用的是MVC有什么关系?他只是一些文章,自定义表,自定义标签什么,MVC是高一层的设计模式的东西,你去自定义一张表,添加一个商品数据,最后显示出来,和你是不是MVC并没有什么冲突啊
解决方案七:
首先是数据持久层,如果要实现“扩展字段”或者说“内容模型”功能的话,最好是不修改数据库表的结构,不然的话就不能用orm框架,只能用比较原始的方式操作数据库了吧。当然不管怎样,能实现都很不错了,主要是在mvc中的model和ef生成的东西应该都不能动态的修改,所以要尽可能不动态修改数据表结构的情况下实现才好。不知道您有没有什么方法可以分享分享的?或者说国内一些主流的CMS都是如何实现“扩展字段”功能的呢?我没有一点思路
解决方案八:
引用1楼sp1234的回复:
Quote: 引用楼主a15086660050的回复:
三张表,一张存储普通的内容,并且有预置的字段,第二张表存储扩展字段名称等信息,第三张表存储第二张表中定义的扩展字段的内容,通过外键与其关联。第一张表再用字段存储其中使用了第二张表中添加的哪些字段的信息及其值在第三个表中值的主键。。。。。突然感觉把自己绕进去了。。。。。哈哈,但隐约觉得好像能实现的样子。。。。。。。好吧,我自己也不知道怎么回事儿了,突然对这个感兴趣,应该也只是因为能解决自己的实际问题罢了。。。。在网上查不到多少资料,别人的源代码我也看不懂,有没有人愿意讨论讨论这个问题呢?或者说已经做过的朋友能否分享一下思路呢?说到我感兴趣的原因,其实很简单,我目前用asp.netmvc4.0给客户做,很多时候都是相同的需求,但就因为数据字段这一块的要求很特殊,导致浪费很多时间,那如果说能够有一个思路实现像市面上流行的CMS那样的类似于“内容模型”或“扩展字段”的效果的话,能够节省很多时间。但市面上很多CMS都是asp.netwebform,可借鉴的的确挺少的,我是希望最好能用ef就是搞定,嘿嘿嘿。。。。。。这种东西叫做DDL,在任何关系数据库系统中都有,它是与DML对应的,它负责动态地“查询一个表的字段定义、外键定义、增减字段、创建索引和外键”等等等等许多功能。也就是说,一个数据库可以是完全“空的”,没有任何数据库表、也没有任何字段、也没用主键和外键,甚至没有任何存储过程和触发器等等。全都可以用很简单的sql语句来动态创建和查询。看来你学习数据库sql时只学过最简单的、别人创建好表结构之后的“增删改查”,没有学过DDL。
那如果是动态创建表的话,我应该就不能使用entityframework了吧,毕竟程序编译以后里面的东西都改不了。如果说这样呢:比如一个文章表,除了基本的字段之外,提前建立一个字段,用来存储所有所扩展的“字段”和值,这样可以吗?
解决方案九:
也在关注这个问题,跟楼主需求基本一样。功力不够,还在考虑解决方案。已经想到一个办法,就是利用动态编译技术来实现自定义模型。创建新模型的时候,把新模型保存在xml文件中,然后在第一次运行或者修改后,加载到内存中,做了初步的验证,但是不知道用在cms中,是否可行
解决方案十:
楼主还是挺不错的啊~我也下载过orchard,看不懂~努力学习插件式的框架设计也搜索过orchard的框架设计,几乎没有如果以后有什么心得~记得写成博客~
解决方案十一:
引用8楼jf_zhang的回复:
也在关注这个问题,跟楼主需求基本一样。功力不够,还在考虑解决方案。已经想到一个办法,就是利用动态编译技术来实现自定义模型。创建新模型的时候,把新模型保存在xml文件中,然后在第一次运行或者修改后,加载到内存中,做了初步的验证,但是不知道用在cms中,是否可行
我找了很多,大概是这样:如果用sql语句去操作的话,就很容易实现,只是对数据库SQL语句和存储过程这一块技能的要求可能比较高;非得用ef的话,就把数据库表设计得灵活一点,应该也没问题。我自己比较偏向于第二种方式,目前建了7个表,用来实现扩展字段和一个非递归方式的无限极分类功能,以及一个基于角色的权限管理功能,目前还在测试CRUD,怕自己技术不行,不敢写,只有建个控制器把所有东西先试着写一遍了,嘿嘿。
解决方案十二:
引用9楼moonwrite的回复:
楼主还是挺不错的啊~我也下载过orchard,看不懂~努力学习插件式的框架设计也搜索过orchard的框架设计,几乎没有如果以后有什么心得~记得写成博客~
orchard我是根本不会用,呵呵呵呵