当前位置:C++技术网 > 资讯 > 关于网站菜单分类以配置文件还是数据库方式实现的综合讨论

关于网站菜单分类以配置文件还是数据库方式实现的综合讨论

更新时间:2017-03-17 10:59:22浏览次数:1+次

    作为一个网站的菜单,一般想到的都是固定不变的。当然各种网站框架在第一次生成网站的时候,会填写各种参数,生成一个固定的菜单。
    固定的菜单是写死在文件中的。如果只是考虑加载速度的话,这样的肯定是最快的。当浏览器请求一个网页时,在处理菜单这部分,就不用单独处理。菜单会随着文件内容一次性读取出来。

    我们把固定的菜单称为静态菜单吧,菜单显示在所有页面里。静态菜单对于服务器处理要求为0,直接可以返回给浏览器显示,因此速度快,性能好。如果仅从菜单显示来看,这个确实就够了。

C++技术网显示的菜单

    然而从其他方面来看,就不能满足要求了。下面都以C++技术网的菜单来举例说明。
1.按照菜单进行分类

    登录网站后,点击“发布”链接可以进入到发布文章的页面。在发布文章时可以选择文章的分类,而文章的分类就是依据菜单来的。不同类的文章,由用户分到不同的类别下。然后在看文章,选择不同的菜单就可以看到对应的内容。

菜单分类

    这是很常见的做法了。然而,如果使用静态菜单,那么就要在所有用到类别选择的地方,重新设置一遍类别,或者写死在代码里,或者写在配置文件里,或者写在数据库里。而不管是哪样,分类发布文章的就和静态菜单没有直接关系了。修改了类目,网站的菜单并不会跟随改变,久而久之,就造成菜单和分类不一致了。

    如果要保持一致,就要去同步修改静态菜单。这就给开发造成了额外的负担和隐患,万一哪一天忘记了改菜单,这样就出现不一致的情况。这是很有可能的。这也是静态菜单的缺点咯。
    当然,至于分类实现里是写死在代码里,还是写在配置文件然后需要的时候从配置文件读取,还是记录数据库里然后需要的时候从数据库读取呢?这个在后面继续讨论。
2.对菜单的内容进行修改
    一个网站的发展随着时间,很多东西都需要做调整。首当其冲的就是菜单。有些内容不合时宜了,有些内容根本不需要了,有些东西需要新增。这是很正常的。此时静态菜单就难以应付。我们在变化的时候需要更新菜单。而更新菜单的时候,也要同步更新分类。这样的话,关联就太大了。
    在这种需求的冲击下,静态菜单的优势已经不用考虑了。
3.定位当前所在位置

    当我们在网站浏览文章时,菜单可以给予很好的类别切换。但是如果在随意浏览文章的时候,你就很可能迷失在网站里,不知道现在的文章页面处于什么类别之下。所以我们需要提供当前位置的导航。而这个导航就需要用到菜单的类别。在现在当前路径时,从首页到频道,再到子频道,再到文章。显示的路径要和菜单一致。而对于这个定位的实现,需要借助分类。

定位当前所在位置

    所以,路径导航和菜单以及分类都产生了关联。如果只有静态菜单,我们就没有办法获取菜单的分类信息,就无法在代码里实现路径的自动生成。我们可以实现的就是对每一个页面进行预先设定。然而对于C++技术网每天都有新文章更新的情况,页面越来越多,而且是动态生成的,你无法预先设定。

    以上种种,都已经说明静态菜单无法满足要求了。倘若我们将静态菜单和后台的分类分开处理,又很容易造成不一致的情况,在修改时需要同步更改。对菜单的增加、删除、修改和查询分类的时候,都造成了很大的问题。
    那么在实现菜单、分类、导航等情况时,我们最好采用动态生成的方式,统一控制。我们只在一个地方配置,然后菜单根据这个配置自动生成、分类也就是这个配置、查询这个配置来生成导航路径。以上的问题就到迎刃而解了。而我们需要在每次页面显示的时候都要进行一次动态生成,这样效率就很低了。而静态菜单正是有这方面的优势。其实解决这个问题倒是有方法。
    不管我们用什么方式配置了分类,我都可以将它读入内存。虽然在创造菜单和路径的时候,是动态的。然而在显示的时候并不需要时刻都去生成一遍。信息都是一样的,每次生成没有价值,而且效率低。所以我们可以将生成的结果缓存起来。这样也就是静态的了。我们就这样生成静态的内容,需要的时候直接传递过去就行了,而不必再次读取配置,速度还是有很大的提升。静态的内容的生成针对的是菜单。只要菜单没有变动,就不必再次读取配置了。而每一个页面加载时查询分类信息来生成路径,这个部分也是可以生成静态的。
    实际上,我们可以将菜单和路径都生成静态的,最后就保存在一个文件里。以后重复的请求,只需要返回这个文件的内容就行了。这个就是文件缓存的原理。这样就和静态网站一样,速度非常快。当配置变化的时候,就重新生成缓存的文件。在开发维护便捷的同时,也提高了速度的要求。当然,就是增加了缓存技术,实现会复杂些。而对于确实需要经常查询分类的时候,我们还可以在读取配置之后,将内容缓存在内存里。因为配置信息毕竟比较少,放在内存里不会占多少内存,但是却可以让后续的查询不再去读取配置,而是直接使用内存缓存的数据,这样查询的速度更快了。只有配置修改的时候,才更新内存缓存。
    最后我们就使用文件缓存和内存缓存技术克服了动态生成的缺点,而又利用动态生成的优势,让开发维护更加方便。而同时也让代码的难度越来越大,复杂性越来越高。而且缓存机制并不是所有人都能够顺利写出来的,很多人或许对于一个小规模的网站不愿意投入更多的开发。
    那么了解了前面这么多,最后我们来讨论我们的中心话题。
    对于配置的实现,我们是在代码写死呢,还是存储在配置文件里,还是存储在数据库里。
1.存储在内存里
    开发最省事的就是直接将分类信息写在代码里。然后需要的时候,通过函数查询即可。这种方式速度挺快的。因为信息在内存中,查询很快。这也是我最开始采用的方式。但是当分类调整的时候,我需要去改代码,而且多个函数查询多个信息,也造成了改动代码范围较大。这样让人有点畏惧。因为这是基础性的查询代码,网站很多地方都会用到,这样牵一发而动全身,很容易出错。这个和静态菜单一样,好处在于速度快,坏处在于难以应付改动。当然在前面说了,我们可以通过内存缓存来改进其他方式带来的速度慢的问题,这个优势也就没有什么特别的了。
2.存储在配置文件里
    我们可以将配置以文件形式存储在磁盘里。在需要的时候读取文件,将内容缓存在内存里。这样似乎很不错了。我们可以随时修改配置文件,就可以很方便的实现配置的修改。然而对于文件的操作,我们需要定义文件的格式,比如采用xml格式,然后要对文件进行解析。这样也就让开发变得麻烦。毕竟我们的格式是自己定义的,没有现成的解析库可以使用,基础解析代码量太多了,而且后续调整起来也是很麻烦。还有,在每一次读取配置时都是启动IO操作,而且没有经过优化,效率不高。
3.存储在数据库里
    我们将配置存储在数据库里。对于数据库的增删改查,都是很成熟的了。在定义格式方面,我们也可以不用太费心了。对于数据的解析,数据库自己都已经可以很好的解决了。虽然数据库的读写也是IO操作,但是数据库对IO操作进行了优化,比我们自己的IO操作效率高很多。在编码实现的时候,也轻松很多。另外,我们已经使用了数据库,我们额外增加一点数据库的查询,并不会有太大的影响。而我们对常见的查询都进行缓存,这样也可以缓解数据库的压力。另外的一个好处就是,我们可以方便实现数据库的多平台的操作。我们就方便的实现网页APP形式的管理后台,通过后台来修改配置。

    以上是我对菜单、分类和路径等问题的综合性的讨论,如果你有不错的想法,欢迎提出来交流哈。